概述
JDBC 百万数据同步优化
我们都知道在同步数据量比较大的情况下会使用JDBC的批量插入,这样会提高我们同步数据之间的效率。
jdbc批量插入示例代码:
public static void main(String[] args) throws Exception {
int count = 10000;
//获取链接
Class.forName("oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/orcl", "root", "root");
//设置插入语句 这个使用预编译的方式插入
String sql = "INSERT INTO DEPT(DEPTNO,NAME,COL) VALUES(?,?,?)";
conn.setAutoCommit(false);
PreparedStatement ps = conn.prepareStatement(sql);
//进行插入
int i = 0;
for(i=0;i<count;i++){
ps.setObject(1, "");
ps.setObject(2, "");
ps.setObject(3, "");
ps.addBatch(); //添加到Batch中
if(i%1000 == 0){ //每1000条一次提交
ps.executeBatch();
conn.commit();
ps.clearBatch();
}
}
if(i%count == 0){ //将剩余的提交
ps.executeBatch();
conn.commit();
ps.clearBatch();
}
//关闭资源
ps.close();
conn.close();
}
这段代码的关键点有:
1)conn.setAutoCommit(false); 关闭JDBC自动提交,使之可以进行批量提交数据。
2)ps.addBatch(); 将SQL语句进行添加到提交批次中。
3)ps.executeUpdate(); conn.commit(); 进行批量提交。
上述示例代码插入一百万数据在本地也就10几秒。
但是有一个数据同步的业务,要从对方库向我们的数据库同步数据。也就是说我们首先要去对方库查询出结果集然后遍历这个结果集插入到我们库中。
同样使用上述的JDBC批量插入代码,在本地进行同步一百万数据也是10多秒。但是在不同的两台主机上同步时,会发现同步需要15分钟左右。很奇怪,为什么不同的主机之间的同步时间相差这么多??
通过各种百度我终于知道原因啦:
慢在查询上啦,为什么这么说??
JDBC在进行查询时不会将所有的结果集都放在内存中,也就是说当你执行:
String sql = "SELECT * FROM DEPT";
PreparedStatement fSet = fps.executeQuery();
while(fSet.next()){
}
这段代码时:fSet.next() JDBC会链接对方库取出一定数量的结果集然后遍历,我们可以通过设置fps.setFetchSize(1000); 这个数量来指定每次去对方库中获取数据的条数。
PreparedStatement fps = fromConn.prepareStatement(sql);
fps.setFetchSize(1000); //(设置游标数,指定每次从数据库中取多少条数据)
ResultSet fSet = fps.executeQuery();
while(fSet.next()){
}
加上这个参数后,在不同主机间进行同步一百万数据在1~2分钟之间(和网络带宽有关系)。
在MySQL 5.0版驱动开始支持,首先设置连接属性useCursorFetch=true,然后在设置fps.setFetchSize(1000);才会生效。
如果您在上述文章中发现有错误的地方欢迎您指出来我会积极去改正。
最后
以上就是清脆啤酒为你收集整理的JDBC 两个库中百万数据同步优化的全部内容,希望文章能够帮你解决JDBC 两个库中百万数据同步优化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复