DataSource 配置
1 packagecom.cheng.dynamic.config;2
3 importjava.util.Properties;4
5 importjavax.sql.DataSource;6
7 importorg.springframework.beans.factory.annotation.Autowired;8 importorg.springframework.boot.jta.atomikos.AtomikosDataSourceBean;9 importorg.springframework.context.annotation.Bean;10 importorg.springframework.context.annotation.Configuration;11 importorg.springframework.context.annotation.Primary;12 importorg.springframework.core.env.Environment;13
14 @Configuration15 public classDataSourceConfig {16 @Autowired17 privateEnvironment env;18
19 @Bean(name = "primaryDS")20 @Primary21 public DataSource primaryDataSource() throwsException{22 AtomikosDataSourceBean ds = newAtomikosDataSourceBean();23 ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");24 ds.setUniqueResourceName("primaryRN");25 ds.setPoolSize(5);26 ds.setXaProperties(build("cheng.primary.datasource."));27 returnds;28 }29
30 @Bean(name = "secondaryDS")31 public DataSource dataSource() throwsException{32 AtomikosDataSourceBean ds = newAtomikosDataSourceBean();33 ds.setXaDataSourceClassName("com.alibaba.druid.pool.xa.DruidXADataSource");34 ds.setUniqueResourceName("secondaryRN");35 ds.setPoolSize(5);36 ds.setXaProperties(build("cheng.secondary.datasource."));37 returnds;38 }39
40 privateProperties build(String prefix) {41 Properties prop = newProperties();42 prop.put("url", env.getProperty(prefix + "url"));43 prop.put("username", env.getProperty(prefix + "username"));44 prop.put("password", env.getProperty(prefix + "password"));45 prop.put("driverClassName", env.getProperty(prefix + "driverClassName"));46
47 returnprop;48 }49 }
JtaTransactionManagerConfig
1 packagecom.cheng.dynamic.config;2
3 importjavax.transaction.UserTransaction;4
5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7 importorg.springframework.transaction.jta.JtaTransactionManager;8
9 importcom.atomikos.icatch.jta.UserTransactionImp;10 importcom.atomikos.icatch.jta.UserTransactionManager;11
12 @Configuration13 public classJtaTransactionManagerConfig {14 @Bean(name = "xatx")15 publicJtaTransactionManager regTransactionManager () {16 UserTransactionManager userTransactionManager = newUserTransactionManager();17 UserTransaction userTransaction = newUserTransactionImp();18 return newJtaTransactionManager(userTransaction, userTransactionManager);19 }20 }
RepositoryPrimaryConfig
1 packagecom.cheng.dynamic.config;2
3 importjavax.sql.DataSource;4
5 importorg.apache.ibatis.session.SqlSessionFactory;6 importorg.mybatis.spring.SqlSessionFactoryBean;7 importorg.mybatis.spring.SqlSessionTemplate;8 importorg.mybatis.spring.annotation.MapperScan;9 importorg.springframework.beans.factory.annotation.Autowired;10 importorg.springframework.beans.factory.annotation.Qualifier;11 importorg.springframework.context.annotation.Bean;12 importorg.springframework.context.annotation.Configuration;13 importorg.springframework.context.annotation.Primary;14 importorg.springframework.core.env.Environment;15 importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;16
17 @Configuration18 @MapperScan(basePackages = "com.cheng.dynamic.repository.primary", sqlSessionTemplateRef = "sqlSessionTemplatePrimary")19 public classRepositoryPrimaryConfig {20 @Autowired21 privateEnvironment env;22 @Autowired23 @Qualifier("primaryDS")24 privateDataSource primaryDS;25
26 @Bean(name="sqlSessionFactoryPrimary")27 @Primary28 public SqlSessionFactory sqlSessionFactoryPrimary() throwsException{29 SqlSessionFactoryBean fb = newSqlSessionFactoryBean();30 fb.setDataSource(primaryDS);31 fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage"));//指定基包
32 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapperLocations")));//指定xml文件位置
33 returnfb.getObject();34 }35
36 @Bean(name = "sqlSessionTemplatePrimary")37 @Primary38 public SqlSessionTemplate sqlSessionTemplatePrimary(@Qualifier("sqlSessionFactoryPrimary") SqlSessionFactory sqlSessionFactory) throwsException {39 SqlSessionTemplate sqlSessionTemplate = newSqlSessionTemplate(sqlSessionFactory);40 returnsqlSessionTemplate;41 }42 }
RepositorySecondaryConfig
1 packagecom.cheng.dynamic.config;2
3 importjavax.sql.DataSource;4
5 importorg.apache.ibatis.session.SqlSessionFactory;6 importorg.mybatis.spring.SqlSessionFactoryBean;7 importorg.mybatis.spring.SqlSessionTemplate;8 importorg.mybatis.spring.annotation.MapperScan;9 importorg.springframework.beans.factory.annotation.Autowired;10 importorg.springframework.beans.factory.annotation.Qualifier;11 importorg.springframework.context.annotation.Bean;12 importorg.springframework.context.annotation.Configuration;13 importorg.springframework.core.env.Environment;14 importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;15
16 @Configuration17 @MapperScan(basePackages = "com.cheng.dynamic.repository.secondary", sqlSessionTemplateRef = "sqlSessionTemplateSecondary")18 public classRepositorySecondaryConfig {19 @Autowired20 privateEnvironment env;21 @Autowired22 @Qualifier("secondaryDS")23 privateDataSource secondaryDS;24
25 @Bean(name="sqlSessionFactorySecondary")26 public SqlSessionFactory sqlSessionFactorySecondary() throwsException{27 SqlSessionFactoryBean fb = newSqlSessionFactoryBean();28 fb.setDataSource(secondaryDS);29 fb.setTypeAliasesPackage(env.getProperty("mybatis.typeAliasesPackage2"));//指定基包
30 fb.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(env.getProperty("mybatis.mapperLocations2")));//指定xml文件位置
31 returnfb.getObject();32 }33
34 @Bean(name = "sqlSessionTemplateSecondary")35 public SqlSessionTemplate sqlSessionTemplateSecondary(@Qualifier("sqlSessionFactorySecondary") SqlSessionFactory sqlSessionFactory) throwsException {36 return newSqlSessionTemplate(sqlSessionFactory);37 }38 }
Test1Service
1 packagecom.cheng.dynamic.service;2
3 importorg.springframework.beans.factory.annotation.Autowired;4 importorg.springframework.stereotype.Service;5 importorg.springframework.transaction.annotation.Transactional;6
7 importcom.cheng.dynamic.entity.Test1;8 importcom.cheng.dynamic.entity.Test2;9 importcom.cheng.dynamic.repository.primary.Test1Dao;10
11 @Service12 @Transactional13 public classTest1Service {14 @Autowired15 privateTest1Dao test1Dao;16 @Autowired17 privateTest2Service test2Service;18
19 public voidtest(){20 System.out.println(test1Dao);21 }22
23 public voidadd(Test1 t){24 System.out.println(test1Dao.add(t));25 System.out.println(t.getId());26 }27
28 public voidsave(){29 Test1 t1 = newTest1();30 t1.setName("t1");31 add(t1);32 //System.out.println(1/0);
33 Test2 t2 = newTest2();34 t2.setName("t2");35 test2Service.add(t2);36 }37 }
测试类
1 packagecom.cheng.dynamic.service;2
3 importorg.junit.Test;4 importorg.junit.runner.RunWith;5 importorg.springframework.beans.factory.annotation.Autowired;6 importorg.springframework.boot.test.context.SpringBootTest;7 importorg.springframework.test.annotation.Rollback;8 importorg.springframework.test.context.junit4.SpringRunner;9 importorg.springframework.transaction.annotation.Transactional;10
11 @RunWith(SpringRunner.class)12 @SpringBootTest()13 @Transactional(transactionManager = "xatx")14 @Rollback(false)15 public classTest1ServiceTest {16 @Autowired17 privateTest1Service test1Service;18 @Test19 public void testTest() throwsException {20 test1Service.save();21 }22
23 }
druid监控配置
1 packagecom.cheng.dynamic.config;2
3 importorg.springframework.boot.web.servlet.FilterRegistrationBean;4 importorg.springframework.boot.web.servlet.ServletRegistrationBean;5 importorg.springframework.context.annotation.Bean;6 importorg.springframework.context.annotation.Configuration;7
8 importcom.alibaba.druid.filter.stat.StatFilter;9 importcom.alibaba.druid.support.http.StatViewServlet;10 importcom.alibaba.druid.support.http.WebStatFilter;11 importcom.alibaba.druid.wall.WallConfig;12 importcom.alibaba.druid.wall.WallFilter;13
14 @Configuration15 public classDruidConfig {16 @Bean17 public ServletRegistrationBeandruidServlet() {18 ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");19
20 //控制台管理用户,加入下面2行 进入druid后台就需要登录21 //servletRegistrationBean.addInitParameter("loginUsername", "admin");22 //servletRegistrationBean.addInitParameter("loginPassword", "admin");
23 returnservletRegistrationBean;24 }25
26 @Bean27 public FilterRegistrationBeanfilterRegistrationBean() {28 FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>();29 filterRegistrationBean.setFilter(newWebStatFilter());30 filterRegistrationBean.addUrlPatterns("/*");31 filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");32 filterRegistrationBean.addInitParameter("profileEnable", "true");33 returnfilterRegistrationBean;34 }35
36 @Bean37 publicStatFilter statFilter(){38 StatFilter statFilter = newStatFilter();39 statFilter.setLogSlowSql(true); //slowSqlMillis用来配置SQL慢的标准,执行时间超过slowSqlMillis的就是慢。
40 statFilter.setMergeSql(true); //SQL合并配置
41 statFilter.setSlowSqlMillis(1000);//slowSqlMillis的缺省值为3000,也就是3秒。
42 returnstatFilter;43 }44
45 @Bean46 publicWallFilter wallFilter(){47 WallFilter wallFilter = newWallFilter();48 //允许执行多条SQL
49 WallConfig config = newWallConfig();50 config.setMultiStatementAllow(true);51 wallFilter.setConfig(config);52 returnwallFilter;53 }54 }
完整代码:https://github.com/lucheng/jta.git
其它:
SpringBoot 多数据源配置 https://github.com/lucheng/dynamic.git
SpringBoot 多数据源 + 动态数据源配置:https://github.com/lucheng/dynamicDatasource.git