Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DruidXADataSource不能正常工作在ORACLE上 #3707

Closed
sharajava opened this issue Feb 27, 2020 · 6 comments
Closed

DruidXADataSource不能正常工作在ORACLE上 #3707

sharajava opened this issue Feb 27, 2020 · 6 comments

Comments

@sharajava
Copy link
Contributor

sharajava commented Feb 27, 2020

测试用例:通过 DruidXADataSource 获取 XA 连接,调用 XA start

@Test
public void testXADataSourceNormal() throws Throwable {
    DruidXADataSource druidDataSource = new DruidXADataSource();
    druidDataSource.setUrl(oracle_jdbcUrl);
    druidDataSource.setUsername(oracle_username);
    druidDataSource.setPassword(oracle_password);
    druidDataSource.setDriverClassName(oracle_driverClassName);

    XAConnection xaConnection = druidDataSource.getXAConnection();
    XAResource xaResource = xaConnection.getXAResource();
    Xid xid = XAXidBuilder.build("127.0.0.1:8091:1234", 1235L);
    xaResource.start(xid, XAResource.TMNOFLAGS);
}

报错:

oracle.jdbc.xa.OracleXAException: XAErr (-3): A resource manager error has occured in the transaction branch. ORA-6550 SQLErr (0)

at oracle.jdbc.xa.OracleXAResource.checkError(OracleXAResource.java:1112)
at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:265)
at io.seata.rm.datasource.XAModeTest2.testXADataSourceNormal(XAModeTest2.java:378)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:628)
at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:117)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:184)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:180)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:127)
at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:68)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:135)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:38)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$5(NodeTestTask.java:139)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$7(NodeTestTask.java:125)
at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:135)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:123)
at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:122)
at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:80)
at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:32)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57)
at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:51)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:229)
at org.junit.platform.launcher.core.DefaultLauncher.lambda$execute$6(DefaultLauncher.java:197)
at org.junit.platform.launcher.core.DefaultLauncher.withInterceptedStreams(DefaultLauncher.java:211)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:191)
at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:128)
at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:69)
at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)

Caused by: java.sql.SQLException: ORA-06550: 第 1 行, 第 14 列:
PLS-00201: 必须声明标识符 'JAVA_XA.XA_START_NEW'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:494)
at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:446)
at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1054)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:252)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:612)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:223)
at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:56)
at oracle.jdbc.driver.T4CCallableStatement.executeForRows(T4CCallableStatement.java:907)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1119)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3780)
at oracle.jdbc.driver.T4CCallableStatement.executeInternal(T4CCallableStatement.java:1300)
at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3887)
at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4230)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.execute(OraclePreparedStatementWrapper.java:1079)
at oracle.jdbc.xa.client.OracleXAResource.doStart(OracleXAResource.java:309)
at oracle.jdbc.xa.client.OracleXAResource.start(OracleXAResource.java:260)
... 52 more

Caused by: Error : 6550, Position : 13, Sql = begin :1 := JAVA_XA.xa_start_new(:2 ,:3 ,:4 ,:5 ,:6 ); end;, OriginalSql = begin ? := JAVA_XA.xa_start_new(?,?,?,?,?); end;, Error Msg = ORA-06550: 第 1 行, 第 14 列:
PLS-00201: 必须声明标识符 'JAVA_XA.XA_START_NEW'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored

at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:498)
... 68 more

而相同的逻辑,使用 ORACLE 驱动包中原生的 XA 数据源 OracleXADataSource 就没有问题:

@Test
public void testXADataSourceNative() throws Throwable {
    OracleXADataSource nativeXADataSource = new OracleXADataSource();
    nativeXADataSource.setURL(oracle_jdbcUrl);
    nativeXADataSource.setUser(oracle_username);
    nativeXADataSource.setPassword(oracle_password);
    nativeXADataSource.setDriverType(oracle_driverClassName);

    XAConnection xaConnection = nativeXADataSource.getXAConnection();
    XAResource xaResource = xaConnection.getXAResource();
    Xid xid = XAXidBuilder.build("127.0.0.1:8091:1234", 1235L);
    xaResource.start(xid, XAResource.TMNOFLAGS);
}

运行正常。

ojdbc 驱动:

    <dependency>
        <groupId>com.oracle</groupId>
        <artifactId>ojdbc6</artifactId>
        <version>11.2.0.1.0</version>
    </dependency>

    <dependency>
        <groupId>com.oracle.jdbc</groupId>
        <artifactId>ojdbc8</artifactId>
        <version>12.2.0.1</version>
    </dependency>

都一样的结果。

ORACLE 数据库:11gR2 Express Edition

@sharajava sharajava changed the title DruidXADataSource不能正常工作 DruidXADataSource不能正常工作在ORACLE上 Feb 27, 2020
@sharajava
Copy link
Contributor Author

通过 DruidXADataSource 创建的 XAConnection 是 oracle.jdbc.xa.client.OracleXAConnection 实例。

@sharajava
Copy link
Contributor Author

而通过 ORACLE 原生数据源 OracleXADataSource 创建的 XAConnection 是 oracle.jdbc.driver.T4CXAConnection 实例。

@sharajava
Copy link
Contributor Author

初步测试,把 com.alibaba.druid.util.OracleUtils#OracleXAConnection 实现改为 T4CXAConnection 就没有问题了。

@wenshao wenshao closed this as completed in 94e2a38 Apr 6, 2020
wenshao added a commit that referenced this issue Apr 6, 2020
@weirr1995
Copy link

哪个版本改成T4CXAConnection了呢

@weirr1995
Copy link

哦哦 看到了

@pubulic123
Copy link

XA模式下Table 'seata.lock_table' doesn't exist怎么解决

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants