|
锁定老贴子 主题:hibernate如何操作多个数据库?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
最后更新时间:2005-03-07
目前的想法如下:
针对每个数据库有一个hibernate的配置文件,然后通过各自的配置文件来初始化各自的Session Factory,我的问题是如果要求在一个transaction中操作几个 数据库,应该怎么做? 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-07
这不是Hibernate的职责,是应用服务器的职责,你需要在应用服务器上面配置XA支持的数据源,然后直接使用JTA(也可以使用SessionBean)来启动事务即可。
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-07
因为希望不具体局限于某个application server,可否告诉一两个实现了JTA的产品,可以直接集成在application server中.
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-07
只要是APPsever,应该没有不实现JTA的吧,楼主好好看看具体server的文档.
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-07
你要找一下支持2PC的应用服务器,例如WebLogic,Websphere,Oracle AS这样的应用服务器的企业版本,编码倒不会绑定到特定的厂商上,因为这都是J2EE的标准。
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-07
多个数据库的话,还要多build几个SessionFactory,通过名字查找他们. 我没试过.
|
|
| 返回顶楼 | |
|
最后更新时间: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> |
|
| 返回顶楼 | |
|
最后更新时间:2005-03-09
在spring+hibernate的weblogic下是比较方便实现底
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-09
但我们现在需要的是一个不依赖于具体的application server的东西,所以就没有考虑weblogic,websphere之类的JTA实现
|
|
| 返回顶楼 | |
|
最后更新时间:2005-03-09
tangdazhu 写道 但我们现在需要的是一个不依赖于具体的application server的东西,所以就没有考虑weblogic,websphere之类的JTA实现
那你就得从底层写起了,无非是:在一个事务对两个数据库操作是一个发生异常,全部回滚么?可以分段提交阿,当提交先提交一个,异常回滚不用执行第二个了,第二个异常时,在自己回滚的同时调用第一个的回滚!其实所谓的容器的jta也是别人封装好的一种分段提交的方式,不用这些现成方式,恐怕就得有本事自己写个myjta了! |
|
| 返回顶楼 | |










