发表于: 2017-10-10 19:03:23

2 676


今天完成的事情: 


1 学习jdbc的批处理


接触到新的一个类PreparedStatement用来批处理:

通过connection.prepareStatement(sql)获得一个PreparedStatement对象,然后系统会对这句sql语句预编译处理,在接下来可以重复利用,比Statement处理相同数量的语句更快。另一方面,它支持利用?占位的方式写动态参数化sql语句。


! 相比于Statement,它更安全。


防止SQL注入错误:

如果验证查询使用strSQL = "SELECT * FROM users WHERE name = '" + userName + "' and pw = '"+ passWord +"';";

userName和passWord都填入1' OR '1'='1,

strSQL = "SELECT * FROM users WHERE name = '1' OR '1'='1' and pw = '1' OR '1'='1';";

判断语句恒成立。。结果就是绕过验证,直接进入了。


利用PreparedStatement参数化查询时数据库服务器不会将参数的内容视为SQL指令的一部份来处理,而是在数据库完成SQL指令的编译后,才套用参数运行。可以防止大部分SQl注入错误。



简单的例子:

String sql = "INSERT INTO student VALUES (?,?,?)";//?占位

PreparedStatement ps = connect.prepareStatment(sql);//预编译

ps.setInt(1,10);//第一个参数是序号(1开始),第二个参数是要传入的值

ps.setSpring(2,"XX");

ps.setInt(3,10);


利用后:

效果感人 比昨天提高了4倍

在url后面添加了一个参数:

rewriteBatchedStatements=true

我的天!只有1秒多


然后通过addBatch和executeBatch函数+开启rewriteBatchedStatements:

public void testAddByDB2() throws SQLException {

   int id = 1;
   String sql = "INSERT INTO student1 VALUES (?,?,?) ";
   Connection connection = DBConnection.getConnection();
   connection.setAutoCommit(false);
   PreparedStatement preparedStatement = connection.prepareStatement(sql);
   for(int i = 1; i <= 100; i++){
              for(int j = 1; j <= 5000; j++){
           preparedStatement.setInt(1,id++);
           preparedStatement.setInt(2,i+j);
           preparedStatement.setInt(3,i + j * 2);
           preparedStatement.addBatch();//缓存
       }
       preparedStatement.executeBatch();//发送给数据库执行
       connection.commit();
       preparedStatement.clearBatch();//清除缓存
   }
   connection.close();
   System.out.println("测试完成");
}


传入50万条数据(包含3个int类型的)用时5秒不到。


2 进行查询对比

100W

index的有事稍微体现了些。


插了3000W:

查询:

index的优势很明显了~~~


2个亿:

额,预计半小时了

查询:

已经不能比了。


测试版本基于mysql-connect-java-5.1.44。



明天计划的事情:


遇到的问题:


收获:

1 感受到index在查询时候的效率了。

2 练习了sql的批量处理。


返回列表 返回列表
评论

    分享到