Search in sources :

Example 1 with DataSourceProxyXANative

use of io.seata.rm.datasource.xa.DataSourceProxyXANative in project seata by seata.

the class DataSourceProxyXANativeTest method testGetConnection.

@Test
public void testGetConnection() throws SQLException {
    // Mock
    Connection connection = Mockito.mock(Connection.class);
    Mockito.when(connection.getAutoCommit()).thenReturn(true);
    DatabaseMetaData metaData = Mockito.mock(DatabaseMetaData.class);
    Mockito.when(metaData.getURL()).thenReturn("jdbc:mysql:xxx");
    Mockito.when(connection.getMetaData()).thenReturn(metaData);
    XAConnection xaConnection = Mockito.mock(XAConnection.class);
    Mockito.when(xaConnection.getConnection()).thenReturn(connection);
    XADataSource xaDataSource = Mockito.mock(XADataSource.class);
    Mockito.when(xaDataSource.getXAConnection()).thenReturn(xaConnection);
    DataSourceProxyXANative dataSourceProxyXANative = new DataSourceProxyXANative(xaDataSource);
    Connection connFromDataSourceProxyXANative = dataSourceProxyXANative.getConnection();
    Assertions.assertTrue(connFromDataSourceProxyXANative instanceof ConnectionProxyXA);
    XAConnection xaConnectionFromProxy = ((ConnectionProxyXA) connFromDataSourceProxyXANative).getWrappedXAConnection();
    Assertions.assertTrue(xaConnection == xaConnectionFromProxy);
    Connection connectionFromProxy = ((ConnectionProxyXA) connFromDataSourceProxyXANative).getWrappedConnection();
    Assertions.assertTrue(connection == connectionFromProxy);
}
Also used : XADataSource(javax.sql.XADataSource) DataSourceProxyXANative(io.seata.rm.datasource.xa.DataSourceProxyXANative) ConnectionProxyXA(io.seata.rm.datasource.xa.ConnectionProxyXA) Connection(java.sql.Connection) XAConnection(javax.sql.XAConnection) DatabaseMetaData(java.sql.DatabaseMetaData) XAConnection(javax.sql.XAConnection) Test(org.junit.jupiter.api.Test)

Example 2 with DataSourceProxyXANative

use of io.seata.rm.datasource.xa.DataSourceProxyXANative in project seata by seata.

the class XAModeTest2 method doTestXAModeNormalCasePhase2.

private void doTestXAModeNormalCasePhase2(boolean globalCommit, String mockXid, Long mockBranchId) throws Throwable {
    // init DataSource: helper
    DruidDataSource helperDS = createNewDruidDataSource();
    Connection helperConn = null;
    Statement helperStat = null;
    ResultSet helperRes = null;
    // init RM
    initRM();
    AbstractDataSourceProxyXA dataSourceProxyXA = null;
    if (nativeXA) {
        // init XADataSource runnerXA
        XADataSource runnerXADS = createNewNativeXADataSource();
        dataSourceProxyXA = new DataSourceProxyXANative(runnerXADS);
    } else {
        // init DataSource: runner
        DruidDataSource runnerDS = createNewDruidDataSource();
        dataSourceProxyXA = new DataSourceProxyXA(runnerDS);
    }
    // Global Tx Phase 2:
    if (globalCommit) {
        DefaultResourceManager.get().branchCommit(dataSourceProxyXA.getBranchType(), mockXid, mockBranchId, dataSourceProxyXA.getResourceId(), null);
        // have a check
        helperConn = helperDS.getConnection();
        helperStat = helperConn.createStatement();
        helperRes = helperStat.executeQuery("select * from test where id = " + testRecordId);
        // should see the test record now
        Assertions.assertTrue(helperRes.next());
        Assertions.assertEquals(helperRes.getInt(1), testRecordId);
        Assertions.assertEquals(helperRes.getString(2), testRecordName);
        helperRes.close();
        helperStat.close();
        helperConn.close();
    } else {
        DefaultResourceManager.get().branchRollback(dataSourceProxyXA.getBranchType(), mockXid, mockBranchId, dataSourceProxyXA.getResourceId(), null);
        // have a check
        helperConn = helperDS.getConnection();
        helperStat = helperConn.createStatement();
        helperRes = helperStat.executeQuery("select * from test where id = " + testRecordId);
        // should NOT see the test record now
        Assertions.assertFalse(helperRes.next());
        helperRes.close();
        helperStat.close();
        helperConn.close();
    }
    System.out.println("Phase2 looks good!");
}
Also used : AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA) DataSourceProxyXA(io.seata.rm.datasource.xa.DataSourceProxyXA) XADataSource(javax.sql.XADataSource) MysqlXADataSource(com.mysql.jdbc.jdbc2.optional.MysqlXADataSource) DruidXADataSource(com.alibaba.druid.pool.xa.DruidXADataSource) PGXADataSource(org.postgresql.xa.PGXADataSource) DataSourceProxyXANative(io.seata.rm.datasource.xa.DataSourceProxyXANative) Statement(java.sql.Statement) Connection(java.sql.Connection) XAConnection(javax.sql.XAConnection) ResultSet(java.sql.ResultSet) DruidDataSource(com.alibaba.druid.pool.DruidDataSource) AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA)

Example 3 with DataSourceProxyXANative

use of io.seata.rm.datasource.xa.DataSourceProxyXANative in project seata by seata.

the class XAModeTest2 method createDataSourceProxyXANative.

private DataSourceProxyXANative createDataSourceProxyXANative() throws Throwable {
    XADataSource originalDS = createNewDruidXADataSource();
    DataSourceProxyXANative dataSourceProxyXA = new DataSourceProxyXANative(originalDS);
    return dataSourceProxyXA;
}
Also used : XADataSource(javax.sql.XADataSource) MysqlXADataSource(com.mysql.jdbc.jdbc2.optional.MysqlXADataSource) DruidXADataSource(com.alibaba.druid.pool.xa.DruidXADataSource) PGXADataSource(org.postgresql.xa.PGXADataSource) DataSourceProxyXANative(io.seata.rm.datasource.xa.DataSourceProxyXANative)

Example 4 with DataSourceProxyXANative

use of io.seata.rm.datasource.xa.DataSourceProxyXANative in project seata by seata.

the class XAModeTest2 method doTestXAModeNormalCasePhase1.

private void doTestXAModeNormalCasePhase1(String mockXid, Long mockBranchId) throws Throwable {
    // init DataSource: helper
    DruidDataSource helperDS = createNewDruidDataSource();
    Connection helperConn = null;
    Statement helperStat = null;
    ResultSet helperRes = null;
    // init RM
    initRM();
    AbstractDataSourceProxyXA dataSourceProxyXA = null;
    if (nativeXA) {
        // init XADataSource runnerXA
        XADataSource runnerXADS = createNewNativeXADataSource();
        dataSourceProxyXA = new DataSourceProxyXANative(runnerXADS);
    } else {
        // init DataSource: runner
        DruidDataSource runnerDS = createNewDruidDataSource();
        dataSourceProxyXA = new DataSourceProxyXA(runnerDS);
    }
    // Global Tx Phase 1:
    RootContext.bind(mockXid);
    Connection testConn = dataSourceProxyXA.getConnection();
    Statement testStat = testConn.createStatement();
    // >>> insert the test record with XA mode
    testStat.execute("insert into test(id, name) values(" + testRecordId + ", '" + testRecordName + "')");
    // >>> close the statement and connection
    testStat.close();
    testConn.close();
    RootContext.unbind();
    // have a check
    helperConn = helperDS.getConnection();
    helperStat = helperConn.createStatement();
    helperRes = helperStat.executeQuery("select * from test where id = " + testRecordId);
    // should NOT see the record(id=888) now
    Assertions.assertFalse(helperRes.next());
    helperRes.close();
    helperStat.close();
    helperConn.close();
    if (JdbcUtils.MYSQL.equals(dbType)) {
        XAXid xaXid = XAXidBuilder.build(mockXid, mockBranchId);
        dataSourceProxyXA.forceClosePhysicalConnection(xaXid);
    }
    System.out.println("Phase1 looks good!");
}
Also used : AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA) DataSourceProxyXA(io.seata.rm.datasource.xa.DataSourceProxyXA) XADataSource(javax.sql.XADataSource) MysqlXADataSource(com.mysql.jdbc.jdbc2.optional.MysqlXADataSource) DruidXADataSource(com.alibaba.druid.pool.xa.DruidXADataSource) PGXADataSource(org.postgresql.xa.PGXADataSource) DataSourceProxyXANative(io.seata.rm.datasource.xa.DataSourceProxyXANative) Statement(java.sql.Statement) Connection(java.sql.Connection) XAConnection(javax.sql.XAConnection) ResultSet(java.sql.ResultSet) XAXid(io.seata.rm.datasource.xa.XAXid) DruidDataSource(com.alibaba.druid.pool.DruidDataSource) AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA)

Example 5 with DataSourceProxyXANative

use of io.seata.rm.datasource.xa.DataSourceProxyXANative in project seata by seata.

the class XAModeTest2 method doTestXAModeNormalCaseAllInOne.

private void doTestXAModeNormalCaseAllInOne(String mockXid, Long mockBranchId) throws Throwable {
    // init DataSource: helper
    DruidDataSource helperDS = createNewDruidDataSource();
    Connection helperConn = null;
    Statement helperStat = null;
    ResultSet helperRes = null;
    // init RM
    initRM();
    AbstractDataSourceProxyXA dataSourceProxyXA = null;
    if (nativeXA) {
        // init XADataSource runnerXA
        XADataSource runnerXADS = createNewNativeXADataSource();
        dataSourceProxyXA = new DataSourceProxyXANative(runnerXADS);
    } else {
        // init DataSource: runner
        DruidDataSource runnerDS = createNewDruidDataSource();
        dataSourceProxyXA = new DataSourceProxyXA(runnerDS);
    }
    // Global Tx Phase 1:
    RootContext.bind(mockXid);
    Connection testConn = dataSourceProxyXA.getConnection();
    Statement testStat = testConn.createStatement();
    // >>> insert the test record with XA mode
    testStat.execute("insert into test(id, name) values(" + testRecordId + ", '" + testRecordName + "')");
    // >>> close the statement and connection
    testStat.close();
    testConn.close();
    RootContext.unbind();
    // have a check
    helperConn = helperDS.getConnection();
    helperStat = helperConn.createStatement();
    helperRes = helperStat.executeQuery("select * from test where id = " + testRecordId);
    // should NOT see the record(id=888) now
    Assertions.assertFalse(helperRes.next());
    helperRes.close();
    helperStat.close();
    helperConn.close();
    // Global Tx Phase 2: run phase 2 with the same runner DS
    DefaultResourceManager.get().branchCommit(dataSourceProxyXA.getBranchType(), mockXid, mockBranchId, dataSourceProxyXA.getResourceId(), null);
    // have a check
    helperConn = helperDS.getConnection();
    helperStat = helperConn.createStatement();
    helperRes = helperStat.executeQuery("select * from test where id = " + testRecordId);
    // should see the test record now
    Assertions.assertTrue(helperRes.next());
    Assertions.assertEquals(helperRes.getInt(1), testRecordId);
    Assertions.assertEquals(helperRes.getString(2), testRecordName);
    helperRes.close();
    helperStat.close();
    helperConn.close();
    System.out.println("All in one looks good!");
}
Also used : AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA) DataSourceProxyXA(io.seata.rm.datasource.xa.DataSourceProxyXA) XADataSource(javax.sql.XADataSource) MysqlXADataSource(com.mysql.jdbc.jdbc2.optional.MysqlXADataSource) DruidXADataSource(com.alibaba.druid.pool.xa.DruidXADataSource) PGXADataSource(org.postgresql.xa.PGXADataSource) DataSourceProxyXANative(io.seata.rm.datasource.xa.DataSourceProxyXANative) Statement(java.sql.Statement) Connection(java.sql.Connection) XAConnection(javax.sql.XAConnection) ResultSet(java.sql.ResultSet) DruidDataSource(com.alibaba.druid.pool.DruidDataSource) AbstractDataSourceProxyXA(io.seata.rm.datasource.xa.AbstractDataSourceProxyXA)

Aggregations

DataSourceProxyXANative (io.seata.rm.datasource.xa.DataSourceProxyXANative)5 XADataSource (javax.sql.XADataSource)5 DruidXADataSource (com.alibaba.druid.pool.xa.DruidXADataSource)4 MysqlXADataSource (com.mysql.jdbc.jdbc2.optional.MysqlXADataSource)4 Connection (java.sql.Connection)4 XAConnection (javax.sql.XAConnection)4 PGXADataSource (org.postgresql.xa.PGXADataSource)4 DruidDataSource (com.alibaba.druid.pool.DruidDataSource)3 AbstractDataSourceProxyXA (io.seata.rm.datasource.xa.AbstractDataSourceProxyXA)3 DataSourceProxyXA (io.seata.rm.datasource.xa.DataSourceProxyXA)3 ResultSet (java.sql.ResultSet)3 Statement (java.sql.Statement)3 ConnectionProxyXA (io.seata.rm.datasource.xa.ConnectionProxyXA)1 XAXid (io.seata.rm.datasource.xa.XAXid)1 DatabaseMetaData (java.sql.DatabaseMetaData)1 Test (org.junit.jupiter.api.Test)1