请问大家一下,我现在对db2和sql两个数据库进行操作,从db2数据库拷贝一些数据到sql数据库中,其中db2是在远程服务器上,sql在本地服务器上
现在只要数据插入到sql数据库中,就更改db2数据库中的状态,说明执行成功,继续拷贝db2中没有更改状态的数据,
此程序是java写的,我想用java中的事务控制来远程和本地的一致,就是那边的状态更新了,本地sql数据库中就有相应的数据,该怎么用啊,请大家帮个忙,谢谢

解决方案 »

  1.   

    可以先把数据从DB2中查出来然后FOR循环插入到SQL SERVER数据库中同时更新对应的DB2中数据的状态。   
      

  2.   

    这是程序的一个片段
     //这是将db2数据库中的数据插入我本地sql数据的函数
     localImage.insert2LocalIncludeImageFile(DownloadServiceServer
    .getLogger()); 
    //这是更新远程库标志(更新db2数据)的函数
    updateRemoteTable(PLCYNUM);
    用事务控制该怎么搞啊
      

  3.   

    一些服务器是支持分布式事务的,2-PHASE commit,我知道weblogic有,http://edocs.bea.com/wls/docs81/oracle/trxjdbcx.html也许有帮助
      

  4.   


    可以先把数据从DB2中查出来然后FOR循环插入到SQL SERVER数据库中同时更新对应的DB2中数据的状态。  用一这个存储过程,看看行不行呀,
      

  5.   

    如果这个数据迁移的操作,只进行一次,推荐楼主,使用其他工具来完成,而不是使用Java编程来实现,
    楼主可以将DB2的数据用导出工具导出,然后,在用工具导入导到本地的数据库当中,最后,手动更新DB2的数据状态,
    不要嫌麻烦,这个效率是最高的,而且,不用产生大量的数据库日志。如果,这些操作是经常性的,而且用程序来完成比较好,那么,楼主可以手动的编写一些代码,来完成这件事情。过程可以分成三个部分,然后循环执行这三个部分,就可以完成这件事情了。
    第一个部分,从DB2中查询一定量的数据(一般为1000条记录),然后将其放到一个集合里面。
    第二个部分,从集合中取一条数据(取一条的同时在集合中要同时删除该数据),向SQL Server中插入数据,然后update DB2中的相关数据。
    第三个部分,重复执行第二个部分,直到集合中没有数据。问题的关键是这第二部分,如果楼主使用的是JDBC的话,注意SQL Server 的Connection要手动提交事物,也就是说要setAutoCommit(false);
    然后使用这个连接向本地数据库插入一条数据,
    之后,用DB2的连接update相关的数据,如果update成功,则本地数据库连接提交数据库事物;如果update失败,则本地连接回滚事物。
    在重新进行第一部分的时候,为成功迁移的数据会被重新处理。
    如果本地数据库提交事物失败时,将提交的数据写入日志,以后手动来处理。
    如果本地数据库回滚事物失败时,将回滚的数据另写日志,以后手动来处理。
    不过,一般事物的提交和回滚不会失败。在多线程迁移数据的时候,第一部分会封装成一个线程,集合会该成一个阻塞队列。
    第二个部分和第三个部分,会封装成多个处理线程。
    第三部分,作为主体部分,第二部分,写成一个方法,被主体部分调用。
      

  6.   

    事务时包含在 connection中的 数据库不通  那么 connection就不同 所以 无法实现 我觉得是这样的
    楼下觉得呢?
      

  7.   

    分布式事务,二阶段提交,你使用XA的驱动就行了。仔细看看吧! XA
      

  8.   

    方案1
    用分布式事务处理(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大型服务器的依赖,但是对编程水平的要求稍微高一点。
      

  9.   

    I don,t known i have not learn this aspect