论坛首页 Java版 Hibernate

hibernate如何操作多个数据库?

浏览 10763 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2005-03-07
目前的想法如下:
   针对每个数据库有一个hibernate的配置文件,然后通过各自的配置文件来初始化各自的Session Factory,我的问题是如果要求在一个transaction中操作几个
数据库,应该怎么做?
   
最后更新时间:2005-03-07
这不是Hibernate的职责,是应用服务器的职责,你需要在应用服务器上面配置XA支持的数据源,然后直接使用JTA(也可以使用SessionBean)来启动事务即可。
   
0 请登录后投票
最后更新时间:2005-03-07
因为希望不具体局限于某个application server,可否告诉一两个实现了JTA的产品,可以直接集成在application server中.
   
0 请登录后投票
最后更新时间:2005-03-07
只要是APPsever,应该没有不实现JTA的吧,楼主好好看看具体server的文档.
   
0 请登录后投票
最后更新时间:2005-03-07
你要找一下支持2PC的应用服务器,例如WebLogic,Websphere,Oracle AS这样的应用服务器的企业版本,编码倒不会绑定到特定的厂商上,因为这都是J2EE的标准。
   
0 请登录后投票
最后更新时间:2005-03-07
多个数据库的话,还要多build几个SessionFactory,通过名字查找他们. 我没试过.
   
0 请登录后投票
最后更新时间:2005-03-08
是不是必须要XA数据源才能用JTA的?我现在的程序没有使用XA的数据源,只能select, 但是不能update和save,是不是由于这个原因呢?
搞了两三天了,如果采用JDBC连接使用JTA就没有问题,如果使用hibernate就不行,郁闷啊.我把程序给出来了,请高手告诉我错误在哪?
public class TestDB3 {

    public void test() {
        Context ctx = null;

        UserTransaction userTransaction = null;
        Transaction ta = null;
        try {
            ctx = new InitialContext();
        } catch (NamingException e3) {

            e3.printStackTrace();
        }

        //   Session informixSession = null;

        Session oracleSession = null;
        try {
            //     _BaseRootDAO.initialize(Constant.INFORMIX_HIBERNATE_CONFIG);
            _BaseRootDAO.initialize(Constant.ORACLE_HIBERNATE_CONFIG);
        } catch (HibernateException e) {

            e.printStackTrace();
        }

        try {

            userTransaction = (UserTransaction) ctx
                    .lookup("java:comp/UserTransaction");

            userTransaction.begin();

            oracleSession = _BaseRootDAO
                    .createSession(Constant.ORACLE_HIBERNATE_CONFIG);

            //  ta = oracleSession.beginTransaction();

            GOptrinfOracle gOptrinfOracle = new GOptrinfOracle();
            gOptrinfOracle.setId("1");
            gOptrinfOracle.setName("test3");
            gOptrinfOracle.setAccmat("333333333");
            gOptrinfOracle.setBranchno("350");
            gOptrinfOracle.setPasswd(new Integer(1).toString());
            gOptrinfOracle.setStatus("0");
            oracleSession.save(gOptrinfOracle);

            //ta.commit();
            oracleSession.close();

            userTransaction.commit();
            System.out.println("done");

        } catch (Exception e5) {

            e5.printStackTrace();
            try {
                userTransaction.rollback();
                // ta.rollback();
            } catch (Exception e1) {

                e1.printStackTrace();
            }
        } finally {
            try {
                if (oracleSession != null)
                    oracleSession.close();
            } catch (HibernateException e) {

                e.printStackTrace();
            }
        }

    }

现在的现象就是程序可以正常执行,但就是无法插入数据,急人啊!!!!!!

我是在tomcat下测试这个程序的,用的JTA产品是JOTM.tomcat下的server.xml中加入了下面的配置:
<Resource name="UserTransaction" auth="Container" type="javax.transaction.UserTransaction"/>
<ResourceParams name="UserTransaction">
<parameter>
<name>factory</name>
<value>org.objectweb.jotm.UserTransactionFactory</value>
</parameter>
<parameter>
<name>jotm.timeout</name>
<value>60</value>
</parameter>
</ResourceParams>
   
0 请登录后投票
最后更新时间:2005-03-09
在spring+hibernate的weblogic下是比较方便实现底
   
0 请登录后投票
最后更新时间:2005-03-09
但我们现在需要的是一个不依赖于具体的application server的东西,所以就没有考虑weblogic,websphere之类的JTA实现
   
0 请登录后投票
最后更新时间:2005-03-09
tangdazhu 写道
但我们现在需要的是一个不依赖于具体的application server的东西,所以就没有考虑weblogic,websphere之类的JTA实现

那你就得从底层写起了,无非是:在一个事务对两个数据库操作是一个发生异常,全部回滚么?可以分段提交阿,当提交先提交一个,异常回滚不用执行第二个了,第二个异常时,在自己回滚的同时调用第一个的回滚!其实所谓的容器的jta也是别人封装好的一种分段提交的方式,不用这些现成方式,恐怕就得有本事自己写个myjta了!
   
0 请登录后投票
论坛首页 Java版 Hibernate

跳转论坛:
JavaEye推荐