我有一个问题,我不知道如何解决和研究网络对我没有多大帮助。我在glassfish 4.0 asadmin控制台中声明了一个可序列化的连接池及其相应的资源。
create-jdbc-connection-pool --datasourceclassname oracle.jdbc.xa.client.OracleXADataSource --maxpoolsize 8 --isolationlevel serializable --restype javax.sql.XADataSource --property Password=A_DB:User=A_DB:URL="jdbc\:oracle\:thin\:@localhost\:1521\:orcl" ATestPool
create-jdbc-resource --connectionpoolid ATestPool jdbc/ATest
然后在无状态bean中,我通过jndi构建数据源,如下所示:
InitialContext ic = new InitialContext();
jndiDataSource = (DataSource) ic.lookup("jdbc/ATest");
我正在获得如下连接
jndiDataSource.getConnection();
通过我们需要的每种方法中的finally子句正确获取和释放连接。 但是,将可序列化连接池与XA数据源配对似乎不起作用,因为获取第一个连接将按以下顺序抛出以下一对异常
JTS5041: The resource manager is doing work outside a global transaction
oracle.jdbc.xa.OracleXAException
at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1110)
RAR5029:Unexpected exception while registering component
javax.transaction.SystemException
at com.sun.jts.jta.TransactionImpl.enlistResource(TransactionImpl.java:224)
以下
RAR7132: Unable to enlist the resource in transaction. Returned resource to pool. Pool name: [ ATestPool ]]]
RAR5117 : Failed to obtain/create connection from connection pool [ ATestPool ]. Reason : com.sun.appserv.connectors.internal.api.PoolingException: javax.transaction.SystemException]]
RAR5114 : Error allocating connection : [Error in allocating a connection. Cause: javax.transaction.SystemException]]].
现在,如果在没有--isolationlevel serializable
的情况下重新创建连接池,那么应用程序可以正常工作而无需对代码进行任何更改。此外,如果保留隔离参数并使用非XA事务
--datasourceclassname oracle.jdbc.pool.OracleDataSource
--restype javax.sql.DataSource
然后再次应用程序工作而不对代码进行任何更改。 我想知道是否有人可以向我解释上述设置中可能出现的问题以及如何使用XA数据源实际进行可序列化工作。感谢。
答案 0 :(得分:0)
我认为您需要启用useNativeXA。