2010-08-10 30 views
0

我正在开发在WebLogic 10上运行的应用程序,当然还有在java中。使用InitialContext获取OracleXADataSource

好,事情是,我使用oracle.jdbc.xa.client.OracleXADataSource管理事务,我也试图与InitialContext的设置OracleXADataSource对象是这样的:

 InitialContext ctx = new InitialContext(); 
    OracleXADataSource oxds = new OracleXADataSource(); 
    oxds = (OracleXADataSource)ctx.lookup("cbs.db.CBSDataSrc"); 

但当i'm运行的应用程序,这将引发我:

java.sql.SQLException: Error creando la conexion - weblogic.jdbc.common.internal.RmiDataSource cannot be cast to oracle.jdbc.xa.client.OracleXADataSource 

at cbs.rtc.daos.commons.DatabaseDAO.getXAPersConnection(DatabaseDAO.java:514) 
at cbs.rtc.daos.utils.UtilDAO.startTransaction(UtilDAO.java:95) 
at cbs.rtc.businessobjects.persona.PersonaJuridicaBussinessObject.crearClienteJuridico(PersonaJuridicaBussinessObject.java:366) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:597) 
at cbs.rtc.businessobjects.AbstractBusinessObject.invoke(AbstractBusinessObject.java:61) 
at cbs.commons.business.BusinessInvoker.invokeTarget(BusinessInvoker.java:88) 
at cbs.services.AbstractService.invokeTarget(AbstractService.java:142) 
at cbs.services.AbstractService.invokeTarget(AbstractService.java:195) 
at cbs.services.persona.PersonaJuridicaServiceBean.crearClienteJuridico(PersonaJuridicaServiceBean.java:135) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     ... 

谁能告诉我为什么我收到RmiDataSource不能转换为OracleXADataSource?

- EDIT-- 而根据这个oracle代码应该工作的示例,不是吗? http://www.oracle.com/technology/sample_code/tech/java/codesnippet/j2ee/jdbc/JDBC_in_J2EE.html

+0

看看这个主题。有一个替代的代码给出了我认为你正在尝试执行的操作http://forums.oracle.com/forums/thread.jspa?threadID=1054658&tstart=150 – JoseK 2010-08-12 10:08:34

回答

1

返回的对象是一个RmiDataSource。 OracleXADataSource既不是子类,也不是RmiDataSource的超类。 RmiDataSource直接或间接与OracleXADataSource进行通信。它可能会也可能不会持有对OracleXADataSource的引用。

如果您使用的是XA数据源,则应该使用JTA来管理事务。

+0

我使用的是JTA,我手动设置了OracleXADataSource,但现在当我需要通过InitialContext将数据库信息提供给OracleXADataSource时,我做错了什么? – Eduardo 2010-08-11 12:54:34

+0

需要哪些数据库信息才能提供给上下文。它应该已经有了连接。任何连接设置应该在连接池级别完成。如果您有查询运行,只需使用上下文提供的数据源并使用JTA提交或回滚。 – BillThor 2010-08-12 18:34:48

+0

我正在使用oracle存储我的数据,并且该连接的驱动程序类设置为oracle.jdbc.xa.client.OracleXADataSource,但仍抛出ClassCastException – Eduardo 2010-08-12 19:54:09

0

除了BillThor的回答,

此代码应为XA数据源

投RmiDataSource工作的javax.sql.DataSource

InitialContext ctx = new InitialContext(); 
    javax.sql.DataSource oxds = (DataSource)ctx.lookup("cbs.db.CBSDataSrc"); 
+1

好的,那部分是好的,但OracleXADataSource对象用于获取:XAConnection xaCon = oxds.getXAConnection();它用于XAResource和Xid来处理事务 – Eduardo 2010-08-11 14:31:06

0

您不必更动OracleXADataSource,XAConnection,XAResource或Xid。所有这些类都由Weblogic的连接池和事务管理器在内部使用。

您需要的是从JNDI获取数据源,如newtoallthis显示的和UserTransaction对象以及控制JTA事务。