Commit 63b5bcd7 by qiuweili123

数据源优化

parent 140131a7
......@@ -10,7 +10,7 @@ import java.net.URLClassLoader;
public class MatrixUrlClassLoader extends URLClassLoader {
private volatile static MatrixUrlClassLoader instance;
private static ClassLoader classLoader = MatrixUrlClassLoader.class.getClassLoader();
private static final Method addUrl;
private static final Method ADD_URL;
//并行加载classLoader
static {
......@@ -20,8 +20,8 @@ public class MatrixUrlClassLoader extends URLClassLoader {
//初始化添加资源
static {
try {
addUrl = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
addUrl.setAccessible(true);
ADD_URL = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
ADD_URL.setAccessible(true);
} catch (NoSuchMethodException e) {
e.printStackTrace();
throw new SystemInternalException();
......@@ -47,7 +47,7 @@ public class MatrixUrlClassLoader extends URLClassLoader {
public void loadByUrl(String urlStr) {
try {
URL url = new URL(urlStr);
addUrl.invoke(classLoader, url);
ADD_URL.invoke(classLoader, url);
} catch (Exception e) {
e.printStackTrace();
throw new SystemInternalException();
......
package com.secoo.mall.common.util.sys;
import com.secoo.mall.common.constant.CommonConstant;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.SystemUtils;
@Slf4j
public class SystemUtil extends SystemUtils {
/**
* -Dapp.id=demo
*/
private static final String APP_ID_KEY = "app.id";
/**
* -Denv=pro
*/
private static final String ENV_KEY = "env";
/**
* 系统唯一标识
*/
public static final String APP_ID = getSystemProperty(APP_ID_KEY,"");
/**
* 环境变量
*/
public static final String ENV = getSystemProperty(ENV_KEY,"pro");
private static String getSystemProperty(final String property,String defaultValue) {
try {
return System.getProperty(property,defaultValue);
} catch (final SecurityException e) {
log.error("Caught a SecurityException reading the system property '" + property
+ "'; the SystemUtils property value will default to null.", e);
return null;
}
}
}
......@@ -2,7 +2,7 @@ package com.secoo.mall.datasource.bean;
import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.datasource.errorCode.DataSourceError;
import com.secoo.mall.datasource.errorcode.DataSourceError;
import com.secoo.mall.datasource.holder.DataSourceContextHolder;
import com.secoo.mall.datasource.provider.DataSourceProvider;
import lombok.Data;
......@@ -41,7 +41,9 @@ public class MatrixDynamicDataSource extends AbsDynamicDataSource implements Ini
*/
protected DataSource getDataSource() {
String dsName = StringUtil.isEmpty(getDsName()) ? DataSourceContextHolder.getDs() : getDsName();
log.info("cur ds is {}", dsName);
if (log.isDebugEnabled()) {
log.debug("cur ds is {}", dsName);
}
return getTargetDataSource(dsName);
}
......@@ -53,9 +55,6 @@ public class MatrixDynamicDataSource extends AbsDynamicDataSource implements Ini
*/
private DataSource getTargetDataSource(String dsName) {
//如果数据源名字为空默认取一个,此种情况可以允许不使用@SelectDataSource指定数据源
/* if (dsName == null) {
dsName = dataSourceMap.keySet().iterator().next();
}*/
if (dataSourceMap.containsKey(dsName)) {
return dataSourceMap.get(dsName);
}
......
......@@ -29,10 +29,6 @@ public interface DataSourceConstant {
*/
String ENCRY_FLAG = "###";
/**
* 应用唯一标识
*/
String APP_ID = "app.id";
/**
* http访问超时时间。10S
*/
Long HTTP_CONNETION_TIME_COUT = TimeUnit.SECONDS.toMillis(10L);
......
package com.secoo.mall.datasource.errorCode;
package com.secoo.mall.datasource.errorcode;
import com.secoo.mall.common.core.errorcode.ErrorCode;
......
......@@ -7,8 +7,9 @@ import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.util.file.IOUtil;
import com.secoo.mall.common.util.net.IpUtil;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.common.util.sys.SystemUtil;
import com.secoo.mall.datasource.constant.DataSourceConstant;
import com.secoo.mall.datasource.errorCode.DataSourceError;
import com.secoo.mall.datasource.errorcode.DataSourceError;
import com.secoo.mall.datasource.util.SysUtil;
import lombok.extern.slf4j.Slf4j;
......@@ -58,7 +59,7 @@ public class EncryptorFactory<T> {
* @return
*/
private String initPrivateKey() {
String appId = System.getProperty(DataSourceConstant.APP_ID);
String appId = SystemUtil.APP_ID;
if (StringUtil.isEmpty(appId)) {
throw new BusinessException(DataSourceError.APP_ID_NOT_EXIST);
}
......@@ -68,9 +69,9 @@ public class EncryptorFactory<T> {
URL url = new URL(String.format(DataSourceConstant.APP_SALT_KEY_PATH, appId));
connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.addRequestProperty(DataSourceConstant.APP_ID, appId);
connection.addRequestProperty("appId", appId);
connection.addRequestProperty("accessToken", SysUtil.getProperty("accessToken"));
connection.addRequestProperty("hostIP", IpUtil.getHostIp());
connection.addRequestProperty("hostIp", IpUtil.getHostIp());
connection.addRequestProperty("hostName", IpUtil.getHostName());
connection.setConnectTimeout(DataSourceConstant.HTTP_CONNETION_TIME_COUT.intValue());
connection.connect();
......
......@@ -7,7 +7,7 @@ import com.secoo.mall.common.core.exception.BusinessException;
import com.secoo.mall.common.util.colletion.CollectionUtil;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.datasource.constant.DataSourceConstant;
import com.secoo.mall.datasource.errorCode.DataSourceError;
import com.secoo.mall.datasource.errorcode.DataSourceError;
import com.secoo.mall.datasource.properties.MatrixDataSourceProperties;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.reflect.MethodUtils;
......
......@@ -10,21 +10,11 @@ public class SysUtil {
private static Properties properties = new Properties();
public static void setProperty(String key, String value) {
/* try {
PropertyUtils.setProperty(HashMap.class, key, value);
} catch (Exception e) {
log.error("set property", e);
}*/
properties.setProperty(key, value);
}
public static String getProperty(String key) {
/* try {
Object property = PropertyUtils.getProperty(HashMap.class, key);
return (T) PropertyUtils.getProperty(HashMap.class, key);
} catch (Exception e) {
log.error("set property", e);
}*/
return properties.getProperty(key);
}
}
package com.secoo.mall.mybatis.bean;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.secoo.mall.mybatis.config.MatrixMybatisConfig;
import com.secoo.mall.mybatis.config.MatrixMybatisGlobalConfig;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import java.io.IOException;
public class MatrixMybatisSqlSessionFactoryBean extends MybatisSqlSessionFactoryBean {
public MatrixMybatisSqlSessionFactoryBean(){
}
public MatrixMybatisSqlSessionFactoryBean(MatrixMybatisConfig matrixMybatisConfig, MatrixMybatisGlobalConfig matrixMybatisGlobalConfig) {
this.setConfiguration(matrixMybatisConfig);
this.setGlobalConfig(matrixMybatisGlobalConfig);
this.setTypeAliasesPackage(matrixMybatisConfig.getBeanAliasPackages());
try {
this.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(matrixMybatisConfig.getResourceClassPath()));
} catch (IOException e) {
e.printStackTrace();
}
}
}
package com.secoo.mall.mybatis.config;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
import com.secoo.mall.common.constant.CommonConstant;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.common.util.sys.SystemUtil;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
@Data
public class MatrixMybatisConfig extends MybatisConfiguration {
private String beanAliasPackages = StringUtil.join(PackageHelper.convertTypeAliasesPackage("com.secoo.mall.**.bean.domain"), ",");
private String resourceClassPath = "classpath:mybatis/*.xml";
public MatrixMybatisConfig() {
if (!SystemUtil.ENV.equals(CommonConstant.Env.PRO)) {
this.addInterceptor(new PerformanceInterceptor());
}
//空值转为null
this.setJdbcTypeForNull(JdbcType.NULL);
// 驼峰转下划线
this.setMapUnderscoreToCamelCase(true);
//分页插件
this.addInterceptor(new PaginationInterceptor());
this.setBeanAliasPackages(beanAliasPackages);
this.setResourceClassPath(resourceClassPath);
}
public MatrixMybatisConfig(String beanAliasPackages,String resourceClassPath) {
this();
this.setBeanAliasPackages(beanAliasPackages);
this.setResourceClassPath(resourceClassPath);
}
}
package com.secoo.mall.mybatis.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.secoo.mall.mybatis.handler.FillDefaultValueHandler;
import lombok.Setter;
import java.util.Objects;
@Setter
public class MatrixMybatisGlobalConfig extends GlobalConfig {
/**
* 增加全局默认的配置
*/
public MatrixMybatisGlobalConfig() {
this.setMetaObjectHandler(getFillDefaultValueHandler());
this.setDbConfig(getDbConfig());
}
public DbConfig getDefaultDbConfig() {
if (Objects.isNull(getDbConfig())) {
return createDefaultDbConfig();
}
return getDbConfig();
}
public MetaObjectHandler getFillDefaultValueHandler() {
return Objects.isNull(this.getMetaObjectHandler()) ? new FillDefaultValueHandler() : this.getMetaObjectHandler();
}
private DbConfig createDefaultDbConfig() {
DbConfig dbConfig = new DbConfig();
dbConfig.setIdType(IdType.AUTO);
dbConfig.setDbType(DbType.MYSQL);
return dbConfig;
}
}
......@@ -6,7 +6,6 @@ import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class FillDefaultValueHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
......
package com.secoo.mall.mybatis.config;
import com.secoo.mall.mybatis.bean.MatrixMybatisSqlSessionFactoryBean;
import com.secoo.mall.mybatis.spring.boot.autoconfigure.MatrixMybatisAutoConfiguration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import javax.sql.DataSource;
//@Configuration
//@AutoConfigureAfter(MatrixMybatisAutoConfiguration.class)
public class MatrixMybatisConfiguration {
/* @Bean
@ConditionalOnMissingBean(SqlSessionFactory.class)
public SqlSessionFactory sqlSessionFactory(DataSource dataSource,MatrixMybatisConfig matrixMybatisConfig,MatrixMybatisGlobalConfig matrixMybatisGlobalConfig) throws Exception {
MatrixMybatisSqlSessionFactoryBean sqlSessionFactory = new MatrixMybatisSqlSessionFactoryBean(matrixMybatisConfig,matrixMybatisGlobalConfig);
*//* sqlSessionFactory.setGlobalConfig(matrixMybatisGlobalConfig());
sqlSessionFactory.setConfiguration(matrixMybatisConfig());*//*
sqlSessionFactory.setDataSource(dataSource);
return sqlSessionFactory.getObject();
}*/
}
package com.secoo.mall.mybatis.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
import com.secoo.mall.common.constant.CommonConstant;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.mybatis.handler.FillDefaultValueHandler;
import com.secoo.mall.mybatis.spring.boot.autoconfigure.MatrixDataSouceAutoConfiguration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@Configuration
@Import(MatrixDataSouceAutoConfiguration.class)
public class MybatisConfig {
@Value("${spring.profiles.active}")
private String profile;
/* @Resource
private MybatisPlusProperties mybatisPlusProperties;*/
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, GlobalConfig globalConfig) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
String[] aliasesPackages = PackageHelper.convertTypeAliasesPackage("com.secoo.mall.**.bean.domain");
globalConfig.getDbConfig().setDbType(DbType.MYSQL);
List<String> list = Stream.of(aliasesPackages).collect(Collectors.toList());
/*文件包别名加载*/
sqlSessionFactory.setTypeAliasesPackage(StringUtil.join(list, ","));
/*配置文件*/
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/*.xml"));
/* 数据源 */
sqlSessionFactory.setDataSource(dataSource);
/* entity扫描,mybatis的Alias功能 */
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setJdbcTypeForNull(JdbcType.NULL);
/* 驼峰转下划线 */
configuration.setMapUnderscoreToCamelCase(true);
/* 分页插件 */
configuration.addInterceptor(new PaginationInterceptor());
/* 乐观锁插件 */
// configuration.addInterceptor(new OptimisticLockerInterceptor());
//非生产环境加载的插件
if (!CommonConstant.Env.PRO.equals(profile)) {
configuration.addInterceptor(new PerformanceInterceptor());
}
sqlSessionFactory.setConfiguration(configuration);
/* 自动填充插件 */
globalConfig.setMetaObjectHandler(new FillDefaultValueHandler());
sqlSessionFactory.setGlobalConfig(globalConfig);
return sqlSessionFactory.getObject();
}
@Bean
public GlobalConfig globalConfig() {
GlobalConfig conf = new GlobalConfig();
GlobalConfig.DbConfig dbConfig = new GlobalConfig.DbConfig();
dbConfig.setIdType(IdType.AUTO);
conf.setDbConfig(dbConfig);
return conf;
}
@Bean
public PerformanceInterceptor performanceInterceptor() {
return new PerformanceInterceptor();
}
}
package com.secoo.mall.mybatis.spring.boot.autoconfigure;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.extension.toolkit.PackageHelper;
import com.ctrip.framework.apollo.spring.boot.ApolloAutoConfiguration;
import com.secoo.mall.common.util.string.StringUtil;
import com.secoo.mall.datasource.bean.MatrixDataSource;
import com.secoo.mall.datasource.bean.MatrixDynamicDataSource;
import com.secoo.mall.datasource.provider.ApolloDataSourceProvider;
import com.secoo.mall.datasource.provider.DataSourceProvider;
import com.secoo.mall.datasource.util.SysUtil;
import com.secoo.mall.mybatis.bean.MatrixMybatisSqlSessionFactoryBean;
import com.secoo.mall.mybatis.config.MatrixMybatisConfig;
import com.secoo.mall.mybatis.config.MatrixMybatisGlobalConfig;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
......@@ -17,20 +24,22 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
@ConditionalOnClass(MatrixDataSource.class)
@AutoConfigureBefore(DataSourceAutoConfiguration.class)
@AutoConfigureBefore({DataSourceAutoConfiguration.class, MybatisPlusAutoConfiguration.class})
@AutoConfigureAfter(ApolloAutoConfiguration.class)
@EnableConfigurationProperties({MatrixDefaultDataSourceProperties.class})
//@Import(MatrixMybatisAutoConfiguration.class)
@Slf4j
public class MatrixDataSouceAutoConfiguration {
public class MatrixMybatisAutoConfiguration {
@Setter
private MatrixDefaultDataSourceProperties matrixDefaultDataSourceProperties;
public MatrixDataSouceAutoConfiguration() {
public MatrixMybatisAutoConfiguration() {
log.info("Init MatrixDataSouceAutoConfiguration");
}
......@@ -54,4 +63,29 @@ public class MatrixDataSouceAutoConfiguration {
public DataSource dataSource() {
return new MatrixDynamicDataSource("default");
}
@Bean
@ConditionalOnMissingBean(SqlSessionFactory.class)
public SqlSessionFactory sqlSessionFactory(DataSource dataSource, MatrixMybatisConfig matrixMybatisConfig, MatrixMybatisGlobalConfig matrixMybatisGlobalConfig) throws Exception {
MatrixMybatisSqlSessionFactoryBean sqlSessionFactory = new MatrixMybatisSqlSessionFactoryBean(matrixMybatisConfig,matrixMybatisGlobalConfig);
sqlSessionFactory.setDataSource(dataSource);
return sqlSessionFactory.getObject();
}
@Bean
@ConditionalOnMissingBean(MatrixMybatisGlobalConfig.class)
public MatrixMybatisGlobalConfig matrixMybatisGlobalConfig() {
MatrixMybatisGlobalConfig globalConfig = new MatrixMybatisGlobalConfig();
return globalConfig;
}
@Bean
@ConditionalOnMissingBean(MatrixMybatisConfig.class)
public MatrixMybatisConfig matrixMybatisConfig() {
MatrixMybatisConfig config = new MatrixMybatisConfig();
return config;
}
}
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.secoo.mall.mybatis.spring.boot.autoconfigure.MatrixDataSouceAutoConfiguration
\ No newline at end of file
com.secoo.mall.mybatis.spring.boot.autoconfigure.MatrixMybatisAutoConfiguration
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment