You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by "FlyingZC (via GitHub)" <gi...@apache.org> on 2023/02/09 03:54:32 UTC

[GitHub] [shardingsphere] FlyingZC opened a new issue, #24070: The statement cache is not closed when the connection is closed

FlyingZC opened a new issue, #24070:
URL: https://github.com/apache/shardingsphere/issues/24070

   ## Bug Report
   In JDBC adapter,the statement cache is not cleared when the connection is closed, and a connection close error is reported.
   
   ### Which version of ShardingSphere did you use?
   Master.
   
   ### Which project did you use? ShardingSphere-JDBC or ShardingSphere-Proxy?
   JDBC
   
   ### Expected behavior
   Clear the statement cache when conection is closed.
   
   ### Actual behavior
   In JDBC adapter,the statement cache is not cleared when the connection is closed, and a connection close error is reported.
   
   ```
   java.sql.SQLException: Connection is closed
   	at com.zaxxer.hikari.pool.ProxyConnection$ClosedConnection.lambda$getClosedConnection$0(ProxyConnection.java:515)
   	at com.sun.proxy.$Proxy6.getMetaData(Unknown Source)
   	at com.zaxxer.hikari.pool.ProxyConnection.getMetaData(ProxyConnection.java:380)
   	at com.zaxxer.hikari.pool.HikariProxyConnection.getMetaData(HikariProxyConnection.java)
   	at org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback.execute(JDBCExecutorCallback.java:85)
   	at org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutorCallback.execute(JDBCExecutorCallback.java:69)
   	at org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine.syncExecute(ExecutorEngine.java:135)
   	at org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine.serialExecute(ExecutorEngine.java:121)
   	at org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine.execute(ExecutorEngine.java:115)
   	at org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor.execute(JDBCExecutor.java:67)
   	at org.apache.shardingsphere.infra.executor.sql.execute.engine.driver.jdbc.JDBCExecutor.execute(JDBCExecutor.java:51)
   	at org.apache.shardingsphere.driver.executor.DriverJDBCExecutor.doExecute(DriverJDBCExecutor.java:152)
   	at org.apache.shardingsphere.driver.executor.DriverJDBCExecutor.execute(DriverJDBCExecutor.java:141)
   	at org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement.useDriverToExecute(ShardingSpherePreparedStatement.java:481)
   	at org.apache.shardingsphere.driver.jdbc.core.statement.ShardingSpherePreparedStatement.execute(ShardingSpherePreparedStatement.java:414)
   	at org.apache.shardingsphere.test.e2e.transaction.cases.temp.BenchmarkInOnePhaseTransaction.oltpReadWrite(BenchmarkInOnePhaseTransaction.java:65)
   	at org.apache.shardingsphere.test.e2e.transaction.case3.jdbc.SimpleSysbenchLocalTransTestCase.testOnePhaseTransaction(SimpleSysbenchLocalTransTestCase.java:36)
   	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.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59)
   	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
   	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56)
   	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
   	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
   	at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100)
   	at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366)
   	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103)
   	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63)
   	at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331)
   	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
   	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
   	at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
   	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
   	at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306)
   	at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
   	at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
   	at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)
   	at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38)
   	at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11)
   	at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35)
   	at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235)
   	at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
   2023-02-09 10:43:08.143 [main] DEBUG com.atomikos.icatch.jta.TransactionImp - enlistResource ( org.apache.shardingsphere.transaction.xa.spi.SingleXAResource@78743dd8 ) with transaction 127.0.0.1.tm167591058813000004
   2023-02-09 10:43:08.143 [main] DEBUG com.atomikos.icatch.imp.TransactionStateHandler - addParticipant ( XAResourceTransaction: XID: 3132372E302E302E312E746D313637353931303538383133303030303034:3132372E302E302E312E746D36 ) for transaction 127.0.0.1.tm167591058813000004
   2023-02-09 10:43:08.143 [main] DEBUG com.atomikos.datasource.xa.XAResourceTransaction - XAResource.start ( XID: 3132372E302E302E312E746D313637353931303538383133303030303034:3132372E302E302E312E746D36 , XAResource.TMNOFLAGS ) on resource 2-ds_0 represented by XAResource instance org.apache.shardingsphere.transaction.xa.spi.SingleXAResource@78743dd8
   2023-02-09 10:43:08.143 [main] DEBUG com.atomikos.icatch.imp.CompositeTransactionImp - registerSynchronization ( com.atomikos.icatch.jta.Sync2Sync@2986427e ) for transaction 127.0.0.1.tm167591058813000004
   ```
   
   ### Reason analyze (If you can)
   <img width="946" alt="image" src="https://user-images.githubusercontent.com/19788130/217712684-58bc213d-2d49-4a48-97aa-8894427d9548.png">
   <img width="1317" alt="image" src="https://user-images.githubusercontent.com/19788130/217713506-5cc19dfc-a044-4f28-b4c5-490ed19b4c90.png">
   
   When the xa transaction is opened on the jdbc side, all previous physical connections corresponding to the current logical connection of `ShardingSphereConnection` will be closed,but the statement cache is not cleared, and the previous statement may be obtained during subsequent execution. When the connection is obtained through statment, a connection closed exception is reported.
   
   
   ### Steps to reproduce the behavior, such as: SQL to execute, sharding rule configuration, when exception occur etc.
   ```yaml
   databaseName: sharding_db
   
   dataSources:
     ds_0:
       dataSourceClassName: com.zaxxer.hikari.HikariDataSource
       driverClassName: com.mysql.jdbc.Driver
       jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_0?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
       username: root
       password: x
     ds_1:
       dataSourceClassName: com.zaxxer.hikari.HikariDataSource
       driverClassName: com.mysql.jdbc.Driver
       jdbcUrl: jdbc:mysql://localhost:3306/demo_ds_1?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8
       username: root
       password: x
   
   rules:
     - !TRANSACTION
       defaultType: XA
       providerType: Atomikos
     - !SHARDING
       tables:
         sbtest1:
           actualDataNodes: ds_${0..1}.sbtest1_${0..1}
           databaseStrategy:
             standard:
               shardingColumn: id
               shardingAlgorithmName: database_id_inline
           tableStrategy:
             standard:
               shardingColumn: id
               shardingAlgorithmName: table_id_inline
       defaultTableStrategy:
         none:
     
       shardingAlgorithms:
         database_id_inline:
           type: INLINE
           props:
             algorithm-expression: ds_${id % 2}
         table_id_inline:
           type: INLINE
           props:
             algorithm-expression: sbtest1_${Math.floorMod(Math.floorDiv(id.longValue(), 2L), 2L)}
     
       keyGenerators:
         snowflake:
           type: SNOWFLAKE
   
   
   mode:
     type: Standalone
   ```
   
   Run `BenchmarkInOnePhaseTransaction` code:
   ```java
   public void oltpReadWrite() throws Exception {
           try {
               connection.setAutoCommit(false);
               int tableNum = random.nextInt(TABLES);
               int randomIdNum = random.nextInt(TABLE_SIZE - 20);
               for (PreparedStatement each : reads) {
                   each.setInt(1, randomIdNum);
                   each.execute();
               }
               
               PreparedStatement indexUpdate = indexUpdates[tableNum];
               indexUpdate.setInt(1, randomIdNum + 4);
               indexUpdate.execute();
               
               PreparedStatement nonIndexUpdate = nonIndexUpdates[tableNum];
               nonIndexUpdate.setString(1, randomString(120));
               nonIndexUpdate.setInt(2, randomIdNum + 4 * 2);
               nonIndexUpdate.execute();
               
               PreparedStatement delete = deletes[tableNum];
               delete.setInt(1, randomIdNum + 4 * 3);
               delete.execute();
               
               PreparedStatement insert = inserts[tableNum];
               insert.setInt(1, randomIdNum + random.nextInt(TABLE_SIZE) * 40);
               insert.setInt(2, random.nextInt(Integer.MAX_VALUE));
               insert.setString(3, randomString(120));
               insert.setString(4, randomString(60));
               insert.execute();
   
               connection.commit();
           } catch (Exception e) {
               e.printStackTrace();
           }
       }
   ```
   
   ### Example codes for reproduce this issue (such as a github link).
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@shardingsphere.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [shardingsphere] TeslaCN closed issue #24070: The statement cache is not closed when the connection is closed

Posted by "TeslaCN (via GitHub)" <gi...@apache.org>.
TeslaCN closed issue #24070: The statement cache is not closed when the connection is closed
URL: https://github.com/apache/shardingsphere/issues/24070


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@shardingsphere.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


[GitHub] [shardingsphere] TeslaCN commented on issue #24070: The statement cache is not closed when the connection is closed

Posted by "TeslaCN (via GitHub)" <gi...@apache.org>.
TeslaCN commented on issue #24070:
URL: https://github.com/apache/shardingsphere/issues/24070#issuecomment-1423761593

   Could we check `Statement.isClosed()` in statement cache?


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@shardingsphere.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org