发表于: 2018-04-07 11:14:41
1 728
day10
终于配置成功了,我不禁雀跃一声,上厕所开门的手都有力了,回来做几个俯卧撑,又站起来骄傲的看着窗外,仿佛天下都是我的
———题记
今天完成的事情:
1. 解决了昨天的遗留问题,头疼了好久晚上心情不好的问题。配置jdk环境变量
接着昨天的,我把系统换成了ubuntu64位,然后下载了64位jdk用WinSCP上传到了服务器,执行 tar -zxvf <包名> 解压,然后配置环境变量
vim /etc/profile
在最后末尾加入以下
export JAVA_HOME=/root/software/jdk1.8.0_161 #一定要是从根目录开始的路径
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
执行 source /etc/profile,让刚才的配置生效,然后 java -version,出现了版本号,代表配置成功。
我昨天一直配置不成功的根源原因在于,JAVA_HOME 的路径有问题,应该是从根目录 / 开始,而我昨天的路径配置的是从root目录开始,一定要配从根目录开始的路径,比如我上面的/root/software/jdk1.8.0_161。
2.写jdbc代码,连接远程数据库。
try {
String sql = "INSERT INTO person(name_,gender,age) VALUES('小王','中','19');";
Connection con = null;
Statement stat = null;
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
//得到连接对象
con = DriverManager.getConnection("jdbc:mysql://39.107.247.104:3306/Jnshu1",
"root","123456xyz");
//执行连接对象
stat = (Statement) con.createStatement();
stat.execute(sql);
//关闭
stat.close();
con.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
执行以上代码后服务器上数据库数据如下
中文显示不出来,在URL后加速指定utf8编码,这样中文就可以正常显示了。
con = DriverManager.getConnection("jdbc:mysql://39.107.247.104:3306/Jnshu1?characterEncoding=utf-8&useSSL=false",
"root","123456xyz");
或者这样:
con = DriverManager.getConnection("jdbc:mysql://39.107.247.104:3306/Jnshu1?"+
"useUnicode=true&characterEncoding=UTF-8&useSSL=false",
"root","123456xyz");
上面三个标红的参数作用是什么呢,
比如说mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
1. 存数据时:
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
2.取数据时:
在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
注意:在xml配置文件中配置数据库URL时,要使用&的转义字符也就是&,
例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&characterEncoding=UTF-8" />
useSSL=false的作用:
web应用中连接mysql数据库时后台会出现这样的提示:
Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
原因是MySQL在高版本需要指明是否进行SSL连接。解决方案如下:
在mysql连接字符串url中加入ssl=true或者false即可,如下所示。
url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding=utf8&useSSL=true
然后在运行就正常显示了
3,测试性能
mybatis框架下基本SQL语句实现下,1000条数据90秒
persondao = sqlSession.getMapper(PersonDao4.class);
while(i<1000){
persondao.add(person);
i++;
}
public interface PersonDao4 {
@Insert("insert into table1(NAME,gender,age) values(#{NAME},#{gender},#{age})")
public void add(Person person);
基本jdbc语句实现下,1000条也差不多90秒。
try {
String sql = "INSERT INTO person(name_,gender,age) VALUES('小白','男','19');";
Connection con = null;
Statement stat = null;
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://39.107.247.104:3306/Jnshu1?"+
"useUnicode=true&characterEncoding=UTF-8&useSSL=false",
"root","123456xyz");
stat = (Statement) con.createStatement();
int i = 0;
while(i <1000){
stat.execute(sql);
i++;
}
stat.close();
con.close();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
一百万条测试了半小时还没完,看来代码太渣,让我感到了自己技术的水平。
另外关于jdbc的很多基础我还掌握的不是很好,比如预编译,比如批量添加,明天一定好好看看。
4.回顾基础(JDBC)
public void testForRemote() throws Exception {
try {
//String sql = "INSERT INTO table1(NAME,gender,age) VALUES('小疯','男','15');";
String sql = "select * from table1 where NAME = '小疯'";
Connection con = null;
Statement stat = null;
//加载驱动
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection("jdbc:mysql://39.107.247.104:3306/Jnshu1?useUnicode=true&"+"characterEncoding=utf-8&useSSL=false","root","123456xyz");stat = (Statement) con.createStatement();
* Statement.execute(sql)会返回true或false
true表示第一个返回值是一个ResultSet对象;false表示这是一个更新语句或者没有结果集。
* Statement.executeUpdate会返回一个int数,表示它影响了多少行,该方法只能用于更新操作,包括增加
* stat.executeQuery(sql)会返回一个结果集,可以通过以下操作将结果集展现出来。
ResultSet rs = stat.executeQuery(sql);
while(rs.next()){
int id = rs.getInt("id");
String name = rs.getString("NAME");
String gender = rs.getString("gender");
String age = rs.getString("age");
System.out.println(id+","+name+","+gender+","+age);
System.out.println();
}
stat.close();
con.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
小课堂:
Linux指令
find / -name my.cnf 从根目录'/'下寻找所有名为'my.cnf'的文件。效果如下
Mysql语句,给表重命名
RENAME TABLE old_table_name TO new_table_name;
明天计划的事情:
1.回顾JDBC基础,包括预编译sql、批量处理等等
2.学习mybatis的批量处理xml文件配置,优化mybatis下的数据库操作性能。
3.测试优化后的代码执行效率
遇到的问题:
1.前天的mysql数据库远程连接不上又复发,该给的权限都给了,最后重启了数据库解决。
重启mysql
/etc/init.d/mysql restart
2.在配置maven环境变量时,编辑/etc/profile文件不小心在末尾手滑加了个'H',当时没注意到就保存了。这下可不得了,一时间所有命令都不能用了,类似于cat ls rm vim source等都不能用了,我瞬间明白了为什么好多配环境变量的教程都是配置在一个 .brahrc 的目录下,因为/etc/profile是系统目录,虽然在这里全局配置可以所有用户共享,子用户不用再配,可是一旦出错系统要残废的。
网上搜了下怎么挽救,发现通过绝对路径的形式是可以执行某些路径的,比如要编辑/etc/profile来修改环境变量,正常情况下使用的命令是:sudo vim /etc/profile,现在,系统找不到sudo 命令,也找不到vim命令,所以只能人工指定它们的绝对路径了。sudo 和 vim都是存放在'/usr/bin'目录下的,所以sudo和vim的绝对路径分别是:/usr/bin/sudo /usr/bin/vim,因此要编辑/etc/profile要使用的命令现在得这样写:
/usr/bin/sudo /usr/bin/vim /etc/profile ,是不是很神奇,我也觉的,通过这种形式修改好了/etc/profile文件后,发现没法source,而source属于内部指令,就是不像vim一样有一个绝对路径,无法通过刚才那种形式执行,所以最终我重装了系统,然后由于久病成医,半个小时给新系统装好了Jdk、maven、和能远程连接的数据库。
3.用navicat给远程数据库插数据时navicat界面报错如下
搜索解决办法有各种去设置的什么的,但设置后发现都没用,还是报错,最后发现这可能是navicat本身的问题,我用SQLyog客户端就没报错。于是暂时舍弃了navicat。
收获:
1. get新技能,想要破环别人的服务器系统,只需要在上面vim /etc/profile然后乱敲一通。
2.JDBC的一些基础
3.开始学习使用Idea
I do not know what I may appear to the world, but to myself I seem to have been only a boy playing on the sea-shore, and diverting myself in now and then finding a smoother pebble or a prettier shell than ordinary, whilst the great ocean of truth lay all undiscovered before me.
评论