Bladeren bron

优化动态数据源

zhouhao 8 jaren geleden
bovenliggende
commit
c3a641c1b8

+ 13 - 2
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/DynamicDataSource.java

@@ -1,15 +1,26 @@
 package org.hswebframework.web.datasource;
 
+import org.hswebframework.web.datasource.switcher.DataSourceSwitcher;
+
 import javax.sql.DataSource;
 
 /**
- * TODO 完成注释
+ * 动态数据源
  *
  * @author zhouhao
+ * @since 3.0
  */
 public interface DynamicDataSource extends DataSource {
+
+    /**
+     * @return 数据源ID
+     * @see DataSourceSwitcher#currentDataSourceId()
+     */
     String getId();
 
+    /**
+     * @return 数据库类型
+     * @see DatabaseType
+     */
     DatabaseType getType();
-
 }

+ 3 - 0
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/DynamicDataSourceAutoConfiguration.java

@@ -1,9 +1,11 @@
 package org.hswebframework.web.datasource;
 
+import org.hswebframework.web.datasource.starter.AopDataSourceSwitcherAutoConfiguration;
 import org.hswebframework.web.datasource.switcher.DataSourceSwitcher;
 import org.hswebframework.web.datasource.switcher.DefaultDataSourceSwitcher;
 import org.springframework.beans.BeansException;
 import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.context.annotation.Bean;
@@ -15,6 +17,7 @@ import org.springframework.context.annotation.Configuration;
  * @author zhouhao
  */
 @Configuration
+@ImportAutoConfiguration(AopDataSourceSwitcherAutoConfiguration.class)
 public class DynamicDataSourceAutoConfiguration implements BeanPostProcessor {
 
     @Bean

+ 1 - 1
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/DynamicDataSourceProxy.java

@@ -47,7 +47,7 @@ public class DynamicDataSourceProxy implements DynamicDataSource {
                             databaseType = DatabaseType.fromJdbcUrl(connection.getMetaData().getURL());
                         }
                     } catch (SQLException e) {
-                        e.printStackTrace();
+                        throw new RuntimeException(e);
                     }
                 }
             }

+ 6 - 0
hsweb-datasource/hsweb-datasource-jta/pom.xml

@@ -54,6 +54,12 @@
             <scope>test</scope>
         </dependency>
 
+        <dependency>
+            <groupId>org.hswebframework</groupId>
+            <artifactId>hsweb-easy-orm-rdb</artifactId>
+            <optional>true</optional>
+        </dependency>
+
         <dependency>
             <groupId>org.springframework</groupId>
             <artifactId>spring-jdbc</artifactId>

+ 10 - 5
hsweb-datasource/hsweb-datasource-jta/src/main/java/org/hswebframework/web/datasource/jta/AtomikosDataSourceAutoConfiguration.java

@@ -25,15 +25,20 @@ public class AtomikosDataSourceAutoConfiguration {
         return new AtomikosDataSourceBean();
     }
 
-    @ConditionalOnMissingBean(JtaDataSourceStore.class)
+    @ConditionalOnMissingBean(JtaDataSourceRepository.class)
     @Bean
-    public MemoryJtaDataSourceStore memoryJtaDataSourceStore() {
-        return new MemoryJtaDataSourceStore();
+    public MemoryJtaDataSourceRepository memoryJtaDataSourceStore() {
+        return new MemoryJtaDataSourceRepository();
     }
 
     @Bean
     @ConditionalOnMissingBean(DynamicDataSourceService.class)
-    public JtaDynamicDataSourceService jtaDynamicDataSourceService(JtaDataSourceStore jtaDataSourceStore, DataSource dataSource) throws SQLException {
-        return new JtaDynamicDataSourceService(jtaDataSourceStore, dataSource);
+    public JtaDynamicDataSourceService jtaDynamicDataSourceService(JtaDataSourceRepository jtaDataSourceRepository, DataSource dataSource) throws SQLException {
+        return new JtaDynamicDataSourceService(jtaDataSourceRepository, dataSource);
+    }
+
+    @Bean
+    public JtaJdbcSqlExecutor jtaJdbcSqlExecutor() {
+        return new JtaJdbcSqlExecutor();
     }
 }

+ 1 - 1
hsweb-datasource/hsweb-datasource-jta/src/main/java/org/hswebframework/web/datasource/jta/JtaDataSourceStore.java

@@ -5,7 +5,7 @@ package org.hswebframework.web.datasource.jta;
  *
  * @author zhouhao
  */
-public interface JtaDataSourceStore {
+public interface JtaDataSourceRepository {
 
     AtomikosDataSourceConfig getConfig(String id);
 

+ 7 - 7
hsweb-datasource/hsweb-datasource-jta/src/main/java/org/hswebframework/web/datasource/jta/JtaDynamicDataSourceService.java

@@ -27,7 +27,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  */
 public class JtaDynamicDataSourceService extends AbstractDynamicDataSourceService {
 
-    private JtaDataSourceStore jtaDataSourceStore;
+    private JtaDataSourceRepository jtaDataSourceRepository;
 
     private Executor executor = Executors.newCachedThreadPool();
 
@@ -38,26 +38,26 @@ public class JtaDynamicDataSourceService extends AbstractDynamicDataSourceServic
         this.executor = executor;
     }
 
-    public JtaDynamicDataSourceService(JtaDataSourceStore jtaDataSourceStore, DynamicDataSource defaultDataSource) {
+    public JtaDynamicDataSourceService(JtaDataSourceRepository jtaDataSourceRepository, DynamicDataSource defaultDataSource) {
         super(defaultDataSource);
-        this.jtaDataSourceStore = jtaDataSourceStore;
+        this.jtaDataSourceRepository = jtaDataSourceRepository;
     }
 
-    public JtaDynamicDataSourceService(JtaDataSourceStore jtaDataSourceStore, DataSource dataSource) throws SQLException {
+    public JtaDynamicDataSourceService(JtaDataSourceRepository jtaDataSourceRepository, DataSource dataSource) throws SQLException {
         super(dataSource);
-        this.jtaDataSourceStore = jtaDataSourceStore;
+        this.jtaDataSourceRepository = jtaDataSourceRepository;
     }
 
     @Override
     protected int getHash(String id) {
-        AtomikosDataSourceConfig config = jtaDataSourceStore.getConfig(id);
+        AtomikosDataSourceConfig config = jtaDataSourceRepository.getConfig(id);
         if (null == config) return 0;
         return config.hashCode();
     }
 
     @Override
     protected DataSourceCache createCache(String id) {
-        AtomikosDataSourceConfig config = jtaDataSourceStore.getConfig(id);
+        AtomikosDataSourceConfig config = jtaDataSourceRepository.getConfig(id);
         if (config == null) {
             throw new DataSourceNotFoundException(id);
         }

+ 48 - 0
hsweb-datasource/hsweb-datasource-jta/src/main/java/org/hswebframework/web/datasource/jta/JtaJdbcSqlExecutor.java

@@ -0,0 +1,48 @@
+package org.hswebframework.web.datasource.jta;
+
+import org.hsweb.ezorm.rdb.executor.AbstractJdbcSqlExecutor;
+import org.hsweb.ezorm.rdb.executor.SQL;
+import org.hswebframework.web.datasource.DataSourceHolder;
+import org.springframework.jdbc.datasource.DataSourceUtils;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+/**
+ * 支持JTA事务的sql执行器
+ *
+ * @author zhouhao
+ * @since 3.0
+ */
+@Transactional(rollbackFor = Throwable.class)
+public class JtaJdbcSqlExecutor extends AbstractJdbcSqlExecutor {
+    @Override
+    public Connection getConnection() {
+        return DataSourceUtils.getConnection(DataSourceHolder.currentDataSource());
+    }
+
+    @Override
+    public void releaseConnection(Connection connection) throws SQLException {
+        DataSourceUtils.releaseConnection(connection, DataSourceHolder.currentDataSource());
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
+    public void exec(SQL sql) throws SQLException {
+        super.exec(sql);
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
+    public void exec(String sql) throws SQLException {
+        super.exec(sql);
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.NOT_SUPPORTED)
+    public void exec(String sql, Object params) throws SQLException {
+        super.exec(sql, params);
+    }
+}

+ 1 - 1
hsweb-datasource/hsweb-datasource-jta/src/main/java/org/hswebframework/web/datasource/jta/MemoryJtaDataSourceStore.java

@@ -11,7 +11,7 @@ import java.util.Map;
  * @author zhouhao
  */
 @ConfigurationProperties(prefix = "hsweb.dynamic")
-public class MemoryJtaDataSourceStore implements JtaDataSourceStore {
+public class MemoryJtaDataSourceRepository implements JtaDataSourceRepository {
     private Map<String, AtomikosDataSourceConfig> datasource = new HashMap<>();
 
     @Override

+ 0 - 22
hsweb-datasource/hsweb-datasource-jta/src/test/java/org/hswebframework/web/datasource/jta/SimpleAtomikosTests.java

@@ -69,30 +69,8 @@ public class SimpleAtomikosTests {
     @Configuration
     @SpringBootApplication
     @EnableJms
-    @ImportAutoConfiguration(AopDataSourceSwitcherAutoConfiguration.class)
     @EnableAspectJAutoProxy
     public static class Config {
-        @Bean
-        public SqlExecutor sqlExecutor() {
-            return new AbstractJdbcSqlExecutor() {
-
-                @Override
-                @Transactional(propagation = Propagation.NOT_SUPPORTED)
-                public void exec(SQL sql) throws SQLException {
-                    super.exec(sql);
-                }
-
-                @Override
-                public Connection getConnection() {
-                    return DataSourceUtils.getConnection(DataSourceHolder.currentDataSource());
-                }
-
-                @Override
-                public void releaseConnection(Connection connection) throws SQLException {
-                    DataSourceUtils.releaseConnection(connection, DataSourceHolder.currentDataSource());
-                }
-            };
-        }
 
         @Bean
         public DynDsTest transTest(SqlExecutor sqlExecutor) {