Browse Source

优化数据源,可手动配置数据库类型. spring.datasource.database-type

zhouhao 6 years ago
parent
commit
d0c7cb29b9

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

@@ -44,11 +44,26 @@ public class DynamicDataSourceAutoConfiguration {
         return new InSpringDynamicDataSourceConfigRepository();
     }
 
+    @Bean
+    @ConfigurationProperties(prefix = "spring.datasource")
+    public HswebDataSourceProperties hswebDataSouceProperties() {
+        return new HswebDataSourceProperties();
+    }
+
     @Bean
     @ConditionalOnMissingBean(DynamicDataSourceService.class)
     public InSpringContextDynamicDataSourceService inMemoryDynamicDataSourceService(DynamicDataSourceConfigRepository<InSpringDynamicDataSourceConfig> repository,
+                                                                                    HswebDataSourceProperties properties,
                                                                                     DataSource dataSource) {
-        DynamicDataSourceProxy dataSourceProxy = new DynamicDataSourceProxy(null, dataSource);
+        DynamicDataSourceProxy dataSourceProxy = new DynamicDataSourceProxy(null, dataSource) {
+            @Override
+            public DatabaseType getType() {
+                if (properties.getDatabaseType() != null) {
+                    return properties.getDatabaseType();
+                }
+                return super.getType();
+            }
+        };
         return new InSpringContextDynamicDataSourceService(repository, dataSourceProxy);
     }
 

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

@@ -1,5 +1,6 @@
 package org.hswebframework.web.datasource;
 
+import lombok.Setter;
 import lombok.SneakyThrows;
 
 import javax.sql.DataSource;
@@ -21,6 +22,7 @@ public class DynamicDataSourceProxy implements DynamicDataSource {
 
     private String id;
 
+    @Setter
     private volatile DatabaseType databaseType;
 
     private DataSource proxy;

+ 15 - 0
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/HswebDataSourceProperties.java

@@ -0,0 +1,15 @@
+package org.hswebframework.web.datasource;
+
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * @author zhouhao
+ * @since 1.0.0
+ */
+@Getter
+@Setter
+public class HswebDataSourceProperties {
+
+    private DatabaseType databaseType;
+}

+ 4 - 0
hsweb-datasource/hsweb-datasource-api/src/main/java/org/hswebframework/web/datasource/config/DynamicDataSourceConfig.java

@@ -1,15 +1,19 @@
 package org.hswebframework.web.datasource.config;
 
 import lombok.Data;
+import org.hswebframework.web.datasource.DatabaseType;
 
 import java.io.Serializable;
 
 @Data
 public class DynamicDataSourceConfig implements Serializable {
     private static final long serialVersionUID = 2776152081818934459L;
+
     private String id;
 
     private String name;
 
     private String describe;
+
+    private DatabaseType databaseType;
 }

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

@@ -1,6 +1,7 @@
 package org.hswebframework.web.datasource.jta;
 
 import lombok.SneakyThrows;
+import org.hswebframework.web.datasource.DatabaseType;
 import org.hswebframework.web.datasource.DynamicDataSource;
 import org.hswebframework.web.datasource.DynamicDataSourceProxy;
 import org.hswebframework.web.datasource.config.DynamicDataSourceConfigRepository;
@@ -44,7 +45,6 @@ public class JtaDynamicDataSourceService extends AbstractDynamicDataSourceServic
         this.executor = executor;
     }
 
-
     @Override
     @SneakyThrows
     protected DataSourceCache createCache(AtomikosDataSourceConfig config) {
@@ -54,7 +54,11 @@ public class JtaDynamicDataSourceService extends AbstractDynamicDataSourceServic
         atomikosDataSourceBean.setUniqueResourceName("dynamic_ds_" + config.getId());
         AtomicInteger successCounter = new AtomicInteger();
         CountDownLatch downLatch = new CountDownLatch(1);
-        DataSourceCache cache = new DataSourceCache(config.hashCode(), new DynamicDataSourceProxy(config.getId(), atomikosDataSourceBean), downLatch, config) {
+        DynamicDataSourceProxy proxy = new DynamicDataSourceProxy(config.getId(), atomikosDataSourceBean);
+        if (config.getDatabaseType() != null) {
+            proxy.setDatabaseType(config.getDatabaseType());
+        }
+        DataSourceCache cache = new DataSourceCache(config.hashCode(), proxy, downLatch, config) {
             @Override
             public void closeDataSource() {
                 super.closeDataSource();
@@ -79,7 +83,6 @@ public class JtaDynamicDataSourceService extends AbstractDynamicDataSourceServic
                 downLatch.countDown();
             } catch (Exception e) {
                 logger.error("init datasource {} error", config.getId(), e);
-
                 //atomikosDataSourceBean.close();
             }
         });

+ 0 - 1
hsweb-starter/hsweb-spring-boot-starter/src/main/java/org/hswebframework/web/starter/HswebAutoConfiguration.java

@@ -172,7 +172,6 @@ public class HswebAutoConfiguration {
     public MapperEntityFactory mapperEntityFactory() {
         MapperEntityFactory entityFactory = new MapperEntityFactory(entityProperties.createMappers());
         FastBeanCopier.setBeanFactory(entityFactory);
-        ;
         return entityFactory;
     }
 

+ 4 - 5
hsweb-system/hsweb-system-datasource/hsweb-system-datasource-local/src/main/java/org/hswebframework/web/service/datasource/simple/InDBJtaDynamicDataSourceService.java

@@ -2,15 +2,13 @@ package org.hswebframework.web.service.datasource.simple;
 
 import com.alibaba.fastjson.JSON;
 import org.hswebframework.web.bean.FastBeanCopier;
+import org.hswebframework.web.datasource.DatabaseType;
 import org.hswebframework.web.datasource.DynamicDataSource;
 import org.hswebframework.web.datasource.config.DynamicDataSourceConfigRepository;
 import org.hswebframework.web.datasource.jta.AtomikosDataSourceConfig;
 import org.hswebframework.web.datasource.jta.JtaDynamicDataSourceService;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Properties;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -54,7 +52,8 @@ public class InDBJtaDynamicDataSourceService extends JtaDynamicDataSourceService
         target.setName(entity.getName());
         target.setDescribe(entity.getDescribe());
         target.setXaProperties(properties);
-
+        target.setDatabaseType(Optional.ofNullable(properties.getProperty("databaseType"))
+                .map(DatabaseType::valueOf).orElse(null));
         return target;
     }