Skip to content

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

Closed
@sharajava

Description

@sharajava
Contributor

测试用例:通过 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

Activity

changed the title [-]DruidXADataSource不能正常工作[/-] [+]DruidXADataSource不能正常工作在ORACLE上[/+] on Feb 27, 2020
sharajava

sharajava commented on Feb 28, 2020

@sharajava
ContributorAuthor

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

sharajava

sharajava commented on Feb 28, 2020

@sharajava
ContributorAuthor

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

sharajava

sharajava commented on Feb 28, 2020

@sharajava
ContributorAuthor

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

added a commit that references this issue on Mar 2, 2020
added a commit that references this issue on Apr 6, 2020

Merge pull request #3710 from sharajava/master

6767d4e
weirr1995

weirr1995 commented on Oct 3, 2020

@weirr1995

哪个版本改成T4CXAConnection了呢

weirr1995

weirr1995 commented on Oct 3, 2020

@weirr1995

哦哦 看到了

pubulic123

pubulic123 commented on Mar 9, 2022

@pubulic123

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @sharajava@weirr1995@pubulic123

        Issue actions

          DruidXADataSource不能正常工作在ORACLE上 · Issue #3707 · alibaba/druid