本人对数据库不是很熟悉,只懂皮毛,有非技术部门的同事要本人帮忙把一个数据库里的数据库的东西导到另一个数据库(负责数据库的同事请假了),于是本人本着学习的心态答应了,于是在网上找了段代码,改了改了也就用了,第一天跑了一千多万行数据挺好,没有出问题。昨天又跑另一个数据库,结果今天早上一看,发现报错,说connect rest,原因是之前本人听同事说过,远程数据库断网断的挺频繁的,本人猜应该是远程数据库断网导致的,因此本人想问怎么样在下面的代码上增加处理,使之可以断网后在服务器连接上后仍能继续工作,或通过设置参数使之能从上次断开的位置继续下去(导入的这个表没有主键,也没有增长规律,最好按行数来)?
另外本人觉得本人这样单行导出速度应该很慢,不知道高手能不能告诉本人java jdbc 数据库有没有比较高效的导入方法(最好提供代码,或api)。
另外本人觉得本人这样单行导出速度应该很慢,不知道高手能不能告诉本人java jdbc 数据库有没有比较高效的导入方法(最好提供代码,或api)。
public void transbase2mssql_dcmap() throws SQLException { String whc, chassbm, chass_ident, location, vinwhc, vin, has_r2, has_r5, has_r7, has_ra, has_rt, has_ry, vin8, has_r4; String sql = ""; resultSet = queryTransbase("select * from DC_MAP"); try{ while(resultSet.next()){ whc = resultSet.getString(1); chassbm = resultSet.getString(2); chass_ident = resultSet.getString(3); location = resultSet.getString(4); vinwhc = resultSet.getString(5); vin = resultSet.getString(6); has_r2 = resultSet.getString(7); has_r5 = resultSet.getString(8); has_r7 = resultSet.getString(9); has_ra = resultSet.getString(10); has_rt = resultSet.getString(11); has_ry = resultSet.getString(12); vin8 = resultSet.getString(13); has_r4 = resultSet.getString(14); sql = "INSERT INTO BENZ_DC_MAP VALUES(""" + whc + """, """ + chassbm + """, """ + chass_ident + """, """ + location + """, """ + vinwhc + """, """ + vin + """, """ + has_r2 + """, """ + has_r5 + """, """ + has_r7 + """, """ + has_ra + """, """ + has_rt + """, """ + has_ry + """, """ + vin8 + """, """ + has_r4 + """);"; pstmt = connSql.prepareStatement(sql); //System.out.println(sql); isSuccess = pstmt.execute(); } System.out.println("dc_map complete"); }catch(Exception e) { System.out.println(sql); e.printStackTrace(); } }
ps:不要说导出为excel什么之类的,被导出的数据库不是一个知名数据库,且管理软件不好用(导出为excel之类的无法全部导出),所以才要求导入到远程数据库的。
假如是帮本人解决中断之后继续下去,请尽量提供代码,原因是本人数据库接触的少,高手可能说的知识点小弟并不清楚,在此先谢了
解决方案:5分
把sql拼接起来eg insert into tableA(“字段a”,”字段b”) values (a,b),(c,d)…;
把这段代码放在循环外,sql只需要执行一次
pstmt = connSql.prepareStatement(sql);
//System.out.println(sql);
isSuccess = pstmt.execute();
把这段代码放在循环外,sql只需要执行一次
pstmt = connSql.prepareStatement(sql);
//System.out.println(sql);
isSuccess = pstmt.execute();
解决方案:20分
假如是固定库(就是库里要迁移的表名称已知),可以考虑做个状态表,每处理完一个表,将状态标记为完成。当然,假如某个表处理失败了,再次处理的时候,这个表是要先清空后入库的。
另外,想提高速度,就多个线程或多台服务器并行执行。这里可以通过状态表的状态来抢占某个待处理的表。
算是一个粗粒度的方案吧!
另外,想提高速度,就多个线程或多台服务器并行执行。这里可以通过状态表的状态来抢占某个待处理的表。
算是一个粗粒度的方案吧!
解决方案:5分
采用批处理方式
sSql = “insert into realyc (字段名) values(?,?)”;
pStatement = (PreparedStatement) connection.prepareStatement(sSql);
循环体中赋值:
pStatement.setFloat(1, 值);
pStatement.setString(2, 值);
pStatement.addBatch();
循环体外:
int[] result = pStatement.executeBatch();
connection.commit();
pStatement.clearBatch();
sSql = “insert into realyc (字段名) values(?,?)”;
pStatement = (PreparedStatement) connection.prepareStatement(sSql);
循环体中赋值:
pStatement.setFloat(1, 值);
pStatement.setString(2, 值);
pStatement.addBatch();
循环体外:
int[] result = pStatement.executeBatch();
connection.commit();
pStatement.clearBatch();
解决方案:5分
要看你这个表能否仍然在跟新,假如不再有更新的话,数据库查询的时候先按照某个字段进行排序取出rownum,然后你插入一条数据的时候就记录下这个rownum,那么下次就知道你上次是导到哪个位置。
解决方案:5分
不能用unload、load之类的脚本么?导出成相似txt的数据文件,然后再导入到新数据库中。