昨天调试了一下数据迁移,因为数据量比较大,所以决定还是采用JDBC来完成数据迁移
程序代码
public void initTransplantStatus () throws Exception
{
Connection conn=null;
Statement st=null;
ResultSet rs=null;
String sql="";
int id=20;
int i=1;
try{
conn=DBUtil.getConnection();
conn.setAutoCommit(true);
st=conn.createStatement();
st2=conn.createStatement();
st.execute("delete from transplant_status");
rs=st.executeQuery("select t.id,cl.id from school t join classes cl on t.id=cl.school_id order by t.id");
while(rs.next())
{
id=id+10;
sql="insert into transplant_status values('"+id+"','"+rs.getString(1)+"','"+rs.getString(2)+"','0',sysdate)";
st.execute(sql);
}
conn.commit();
rs.close();
st.close();
}catch(Exception e)
{
System.out.println(e.getMessage());
err=" 初始化迁移状态表时出错!";
throw new Exception(e.getMessage());
}
}
上 面的程序是不正确的,直接的结果就是初始化迁移状态表时只有一条记录;原因是ResultSet是依赖于Statement的,Statement在执行 execute后,记录集的结果将丢失,所以记录集循环只执行了一次,解决方法是记录集的获取或execute操作采用另外的Statement;
程序代码
public void initTransplantStatus () throws Exception
{
Connection conn=null;
Statement st=null;
Statement st2=null;
ResultSet rs=null;
String sql="";
int id=20;
System.out.println(st.KEEP_CURRENT_RESULT);
int i=1;
try{
conn=DBUtil.getConnection();
conn.setAutoCommit(true);
st=conn.createStatement();
st2=conn.createStatement();
st.execute("delete from transplant_status");
rs=st.executeQuery("select t.id,cl.id from school t join classes cl on t.id=cl.school_id order by t.id");
while(rs.next())
{
id=id+10; sql="insert into transplant_status values('"+id+"','"+rs.getString(1)+"','"+rs.getString(2)+"','0',sysdate)";
st2 .execute(sql);
}
conn.commit();
rs.close();
st.close();
st2.close();
}catch(Exception e)
{
System.out.println(e.getMessage());
err=" 初始化迁移状态表时出错!";
throw new Exception(e.getMessage());
}
}
在 这里,我 们用id=id+10实现 ORACLE的sequence序列,因为jdbc连接取自于Hibernate,所以不用显式关闭,而交由Hibernate智能管理;
注 意: 由于这里采用的是hibernate的JDBC,所以与纯JDBC有所区别,具体请见:
http://www.gold98.net/blog/article.asp?id=453
在 适当的时候,我 们可以采用批处理,但测 试 过好几次,感觉对比较果不是很明显,这就根据各自需要来定了~
在多表操作时,我 们仍应坚持先conn.setAutoCommit(false)后 conn.setAutoCommit(true)的原则;