请问大家一下,我现在对db2和sql两个数据库进行操作,从db2数据库拷贝一些数据到sql数据库中,其中db2是在远程服务器上,sql在本地服务器上
现在只要数据插入到sql数据库中,就更改db2数据库中的状态,说明执行成功,继续拷贝db2中没有更改状态的数据,
此程序是java写的,我想用java中的事务控制来远程和本地的一致,就是那边的状态更新了,本地sql数据库中就有相应的数据,该怎么用啊,请大家帮个忙,谢谢
现在只要数据插入到sql数据库中,就更改db2数据库中的状态,说明执行成功,继续拷贝db2中没有更改状态的数据,
此程序是java写的,我想用java中的事务控制来远程和本地的一致,就是那边的状态更新了,本地sql数据库中就有相应的数据,该怎么用啊,请大家帮个忙,谢谢
//这是将db2数据库中的数据插入我本地sql数据的函数
localImage.insert2LocalIncludeImageFile(DownloadServiceServer
.getLogger());
//这是更新远程库标志(更新db2数据)的函数
updateRemoteTable(PLCYNUM);
用事务控制该怎么搞啊
可以先把数据从DB2中查出来然后FOR循环插入到SQL SERVER数据库中同时更新对应的DB2中数据的状态。 用一这个存储过程,看看行不行呀,
楼主可以将DB2的数据用导出工具导出,然后,在用工具导入导到本地的数据库当中,最后,手动更新DB2的数据状态,
不要嫌麻烦,这个效率是最高的,而且,不用产生大量的数据库日志。如果,这些操作是经常性的,而且用程序来完成比较好,那么,楼主可以手动的编写一些代码,来完成这件事情。过程可以分成三个部分,然后循环执行这三个部分,就可以完成这件事情了。
第一个部分,从DB2中查询一定量的数据(一般为1000条记录),然后将其放到一个集合里面。
第二个部分,从集合中取一条数据(取一条的同时在集合中要同时删除该数据),向SQL Server中插入数据,然后update DB2中的相关数据。
第三个部分,重复执行第二个部分,直到集合中没有数据。问题的关键是这第二部分,如果楼主使用的是JDBC的话,注意SQL Server 的Connection要手动提交事物,也就是说要setAutoCommit(false);
然后使用这个连接向本地数据库插入一条数据,
之后,用DB2的连接update相关的数据,如果update成功,则本地数据库连接提交数据库事物;如果update失败,则本地连接回滚事物。
在重新进行第一部分的时候,为成功迁移的数据会被重新处理。
如果本地数据库提交事物失败时,将提交的数据写入日志,以后手动来处理。
如果本地数据库回滚事物失败时,将回滚的数据另写日志,以后手动来处理。
不过,一般事物的提交和回滚不会失败。在多线程迁移数据的时候,第一部分会封装成一个线程,集合会该成一个阻塞队列。
第二个部分和第三个部分,会封装成多个处理线程。
第三部分,作为主体部分,第二部分,写成一个方法,被主体部分调用。
楼下觉得呢?
用分布式事务处理(JTA)
一般大型的服务器都有集成
XA系列的驱动。比如weblogic在配连接池的时候就有XA系列的驱动
然后在程序里用JNDi得到数据源对象,这样一句rollback等于两个数据库同时rollback方案2
设立两个关键词
分别创建两个Connection对象
Connection connDb2 = .....;
Connection connSqlServer = ......;
try{
//执行操作}catch(Exception e) {
connDb2.rollback();
connSqlServer.rollback();
}
connDb2.commit();
connSqlServer.commit();
就是不管做啥操作,两个对象的动作要一致就行了,这个方法可以避免对于java大型服务器的依赖,但是对编程水平的要求稍微高一点。