本人对数据库不是很熟悉,只懂皮毛,有非技术部门的同事要我帮忙把一个数据库里的数据库的东西导到另一个数据库(负责数据库的同事请假了),于是我本着学习的心态答应了,于是在网上找了段代码,改了改了也就用了,第一天跑了一千多万行数据挺好,没有出问题。昨天又跑另一个数据库,结果今天早上一看,发现报错,说connect rest,因为之前我听同事说过,远程数据库断网断的挺频繁的,我猜应该是远程数据库断网导致的,因此我想问如何在下面的代码上增加处理,使之可以断网后在服务器连接上后仍能继续工作,或者通过设置参数使之能从上次断开的位置继续下去(导入的这个表没有主键,也没有增长规律,最好按行数来)?
另外我觉得我这样单行导出速度应该很慢,不知道大神能不能告诉我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之类的无法全部导出),所以才要求导入到远程数据库的。
如果是帮我解决中断之后继续下去,请尽量提供代码,因为本人数据库接触的少,大神可能说的知识点小弟并不明白,在此先谢了
------解决思路----------------------
把sql拼接起来eg insert into tableA("字段a","字段b") values (a,b),(c,d)...;
把这段代码放在循环外,sql只需要执行一次
pstmt = connSql.prepareStatement(sql);
//System.out.println(sql);
isSuccess = pstmt.execute();
------解决思路----------------------
如果是固定库(就是库里要迁移的表名称已知),可以考虑做个状态表,每处理完一个表,将状态标记为完成。当然,如果某个表处理失败了,再次处理的时候,这个表是要先清空后入库的。
另外,想提高速度,就多个线程或者多台服务器并行执行。这里可以通过状态表的状态来抢占某个待处理的表。
算是一个粗粒度的方案吧!
------解决思路----------------------
采用批处理方式
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();
------解决思路----------------------
要看你这个表是否仍然在跟新,如果不再有更新的话,数据库查询的时候先按照某个字段进行排序取出rownum,然后你插入一条数据的时候就记录下这个rownum,那么下次就知道你上次是导到哪个位置。
------解决思路----------------------
不能用unload、load之类的脚本么?导出成类似txt的数据文件,然后再导入到新数据库中。