You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/05/18 02:06:54 UTC

[shardingsphere] branch master updated: Fix sonar volatile issue in `XAConnectionWrapper` (#25739)

This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new 268921ae7ac Fix sonar volatile issue in `XAConnectionWrapper` (#25739)
268921ae7ac is described below

commit 268921ae7ac09c5a9285dd0ec8b9574f098b2d48
Author: ZhangCheng <ch...@apache.org>
AuthorDate: Thu May 18 10:06:47 2023 +0800

    Fix sonar volatile issue in `XAConnectionWrapper` (#25739)
    
    * Fix sonar volatile problem in `XAConnectionWrapper`
    
    * fix
    
    * Fix
---
 .../connection/dialect/H2XAConnectionWrapper.java    | 20 ++++++++++----------
 .../dialect/MariaDBXAConnectionWrapper.java          | 16 ++++++++--------
 .../connection/dialect/MySQLXAConnectionWrapper.java | 16 ++++++++--------
 .../dialect/OpenGaussXAConnectionWrapper.java        | 16 ++++++++--------
 .../dialect/OracleXAConnectionWrapper.java           | 16 ++++++++--------
 .../dialect/PostgreSQLXAConnectionWrapper.java       | 16 ++++++++--------
 .../xa/jta/datasource/XATransactionDataSource.java   |  8 ++++----
 7 files changed, 54 insertions(+), 54 deletions(-)

diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/H2XAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/H2XAConnectionWrapper.java
index 3e2109abf4d..1f26bcb376b 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/H2XAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/H2XAConnectionWrapper.java
@@ -26,6 +26,7 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for H2.
@@ -34,25 +35,24 @@ public final class H2XAConnectionWrapper implements XAConnectionWrapper {
     
     private static final int XA_DATA_SOURCE_TRACE_TYPE_ID = 13;
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Constructor<?> xaConnectionConstructor;
+    private Constructor<?> xaConnectionConstructor;
     
-    private static volatile Method nextIdMethod;
+    private Method nextIdMethod;
     
-    private static volatile Object dataSourceFactory;
-    
-    private static volatile boolean initialized;
+    private Object dataSourceFactory;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionConstructor = getXAConnectionConstructor();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MariaDBXAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MariaDBXAConnectionWrapper.java
index 0ffbb668bce..90aaaaa3e47 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MariaDBXAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MariaDBXAConnectionWrapper.java
@@ -25,27 +25,27 @@ import javax.sql.XADataSource;
 import java.lang.reflect.Constructor;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for MariaDB.
  */
 public final class MariaDBXAConnectionWrapper implements XAConnectionWrapper {
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Constructor<?> xaConnectionConstructor;
-    
-    private static volatile boolean initialized;
+    private Constructor<?> xaConnectionConstructor;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionConstructor = getXAConnectionConstructor();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MySQLXAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MySQLXAConnectionWrapper.java
index 3430155ef04..22db6ef23ba 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MySQLXAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/MySQLXAConnectionWrapper.java
@@ -25,27 +25,27 @@ import javax.sql.XADataSource;
 import java.lang.reflect.Method;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for MySQL.
  */
 public final class MySQLXAConnectionWrapper implements XAConnectionWrapper {
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Method xaConnectionCreatorMethod;
-    
-    private static volatile boolean initialized;
+    private Method xaConnectionCreatorMethod;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(xaDataSource, connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionCreatorMethod = getXAConnectionCreatorMethod();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OpenGaussXAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OpenGaussXAConnectionWrapper.java
index 39e7ee0dccf..5b23811d504 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OpenGaussXAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OpenGaussXAConnectionWrapper.java
@@ -25,27 +25,27 @@ import javax.sql.XADataSource;
 import java.lang.reflect.Constructor;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for openGauss.
  */
 public final class OpenGaussXAConnectionWrapper implements XAConnectionWrapper {
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Constructor<?> xaConnectionConstructor;
-    
-    private static volatile boolean initialized;
+    private Constructor<?> xaConnectionConstructor;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionConstructor = getXAConnectionConstructor();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OracleXAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OracleXAConnectionWrapper.java
index 2cd070745d3..bf3eec5a94b 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OracleXAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/OracleXAConnectionWrapper.java
@@ -25,27 +25,27 @@ import javax.sql.XADataSource;
 import java.lang.reflect.Constructor;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for Oracle.
  */
 public final class OracleXAConnectionWrapper implements XAConnectionWrapper {
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Constructor<?> xaConnectionConstructor;
-    
-    private static volatile boolean initialized;
+    private Constructor<?> xaConnectionConstructor;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionConstructor = getXAConnectionConstructor();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/PostgreSQLXAConnectionWrapper.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/PostgreSQLXAConnectionWrapper.java
index eb9015b3f72..ee08e14ff96 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/PostgreSQLXAConnectionWrapper.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/connection/dialect/PostgreSQLXAConnectionWrapper.java
@@ -25,27 +25,27 @@ import javax.sql.XADataSource;
 import java.lang.reflect.Constructor;
 import java.sql.Connection;
 import java.sql.SQLException;
+import java.util.Properties;
 
 /**
  * XA connection wrapper for PostgreSQL.
  */
 public final class PostgreSQLXAConnectionWrapper implements XAConnectionWrapper {
     
-    private static volatile Class<Connection> jdbcConnectionClass;
+    private Class<Connection> jdbcConnectionClass;
     
-    private static volatile Constructor<?> xaConnectionConstructor;
-    
-    private static volatile boolean initialized;
+    private Constructor<?> xaConnectionConstructor;
     
     @Override
     public XAConnection wrap(final XADataSource xaDataSource, final Connection connection) throws SQLException {
-        if (!initialized) {
-            loadReflection();
-            initialized = true;
-        }
         return createXAConnection(connection.unwrap(jdbcConnectionClass));
     }
     
+    @Override
+    public void init(final Properties props) {
+        loadReflection();
+    }
+    
     private void loadReflection() {
         jdbcConnectionClass = getJDBCConnectionClass();
         xaConnectionConstructor = getXAConnectionConstructor();
diff --git a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/XATransactionDataSource.java b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/XATransactionDataSource.java
index becae73e49a..3284a410cc1 100644
--- a/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/XATransactionDataSource.java
+++ b/kernel/transaction/type/xa/core/src/main/java/org/apache/shardingsphere/transaction/xa/jta/datasource/XATransactionDataSource.java
@@ -50,22 +50,22 @@ public final class XATransactionDataSource implements AutoCloseable {
     
     private final ThreadLocal<Map<Transaction, Connection>> enlistedTransactions = ThreadLocal.withInitial(HashMap::new);
     
-    private final DatabaseType databaseType;
-    
     private final String resourceName;
     
     private final DataSource dataSource;
     
     private XADataSource xaDataSource;
     
+    private XAConnectionWrapper xaConnectionWrapper;
+    
     private XATransactionManagerProvider xaTransactionManagerProvider;
     
     public XATransactionDataSource(final DatabaseType databaseType, final String resourceName, final DataSource dataSource, final XATransactionManagerProvider xaTransactionManagerProvider) {
-        this.databaseType = databaseType;
         this.resourceName = resourceName;
         this.dataSource = dataSource;
         if (!CONTAINER_DATASOURCE_NAMES.contains(dataSource.getClass().getSimpleName())) {
             xaDataSource = new DataSourceSwapper(TypedSPILoader.getService(XADataSourceDefinition.class, databaseType.getType())).swap(dataSource);
+            xaConnectionWrapper = TypedSPILoader.getService(XAConnectionWrapper.class, databaseType.getType());
             this.xaTransactionManagerProvider = xaTransactionManagerProvider;
             xaTransactionManagerProvider.registerRecoveryResource(resourceName, xaDataSource);
         }
@@ -86,7 +86,7 @@ public final class XATransactionDataSource implements AutoCloseable {
         Transaction transaction = xaTransactionManagerProvider.getTransactionManager().getTransaction();
         if (!enlistedTransactions.get().containsKey(transaction)) {
             Connection connection = dataSource.getConnection();
-            XAConnection xaConnection = TypedSPILoader.getService(XAConnectionWrapper.class, databaseType.getType()).wrap(xaDataSource, connection);
+            XAConnection xaConnection = xaConnectionWrapper.wrap(xaDataSource, connection);
             transaction.enlistResource(new SingleXAResource(resourceName, xaConnection.getXAResource()));
             transaction.registerSynchronization(new Synchronization() {