赞
踩
Spring boot 从1.5到2.0到2.1 版本不停的更新。多数据源配置每次都会改变。最新的spring boot2.1多数据源配置方式请参照下面介绍
spring boot 2.1
druid 1.1.14
mysql
spring.datasource.primary.url=url
spring.datasource.primary.username=
spring.datasource.primary.password=
spring.datasource.primary.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.secondary.url=
spring.datasource.secondary.username=
spring.datasource.secondary.password=
spring.datasource.secondary.type=com.alibaba.druid.pool.DruidDataSource
package com.conf.datasource; import com.alibaba.druid.pool.DruidDataSource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.servlet.ServletComponentScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.sql.SQLException; /** * @ClassName: DruidDBConfig * @Description: * @Author: zhaiwelong * @CreateDate: 2019/3/2 8:19 */ @ServletComponentScan @Configuration public class DruidDBConfig { private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class); @Value("${spring.datasource.primary.url}") private String dbUrl1; @Value("${spring.datasource.primary.username}") private String username1; @Value("${spring.datasource.primary.password}") private String password1; @Value("${spring.datasource.secondary.username}") private String username2; @Value("${spring.datasource.secondary.password}") private String password2; @Value("${spring.datasource.secondary.url}") private String dbUrl2; @Value("com.mysql.jdbc.Driver") private String driverClassName; @Value("5") private int initialSize; @Value("5") private int minIdle; @Value("20") private int maxActive; @Value("60000") private int maxWait; /** * 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 */ @Value("60000") private int timeBetweenEvictionRunsMillis; /** * 配置一个连接在池中最小生存的时间,单位是毫秒 */ @Value("300000") private int minEvictableIdleTimeMillis; @Value("SELECT 1 FROM DUAL") private String validationQuery; @Value("true") private boolean testWhileIdle; @Value("false") private boolean testOnBorrow; @Value("false") private boolean testOnReturn; /** * 打开PSCache,并且指定每个连接上PSCache的大小 */ @Value("true") private boolean poolPreparedStatements; @Value("20") private int maxPoolPreparedStatementPerConnectionSize; /** * 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 */ @Value("stat,wall,log4j") private String filters; /** * 通过connectProperties属性来打开mergeSql功能;慢SQL记录 */ @Value("druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500") private String connectionProperties; @Bean(name = "primaryDataSource") @Qualifier("primaryDataSource") public DataSource dataSource() { return getDruidDataSource(username1, password1, dbUrl1); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary public DataSource secondaryDataSource() { return getDruidDataSource(username2, password2, dbUrl2); } private DruidDataSource getDruidDataSource(String username, String password, String url) { DruidDataSource datasource = new DruidDataSource(); datasource.setUrl(url); datasource.setUsername(username); datasource.setPassword(password); datasource.setDriverClassName(driverClassName); //configuration datasource.setInitialSize(initialSize); datasource.setMinIdle(minIdle); datasource.setMaxActive(maxActive); datasource.setMaxWait(maxWait); datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); datasource.setValidationQuery(validationQuery); datasource.setTestWhileIdle(testWhileIdle); datasource.setTestOnBorrow(testOnBorrow); datasource.setTestOnReturn(testOnReturn); datasource.setPoolPreparedStatements(poolPreparedStatements); datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { datasource.setFilters(filters); } catch (SQLException e) { logger.error("druid configuration initialization filter : {0}", e); } datasource.setConnectionProperties(connectionProperties); return datasource; } }
package com.conf.datasource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.Map; @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryUser", transactionManagerRef = "transactionManagerUser", //TODO 注意修改为自己的primary的repository路径 basePackages = {"com.zwl.repository.primary"}) public class PrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Primary @Bean(name = "entityManagerUser") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryUser(builder).getObject().createEntityManager(); } @Primary @Bean(name = "entityManagerFactoryUser") public LocalContainerEntityManagerFactoryBean entityManagerFactoryUser(EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) //TODO 注意修改为自己的primary的model路径 .packages("com.zwl.model.primary") .persistenceUnit("userPersistenceUnit") .properties(getVendorProperties()) .build(); } private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @Primary @Bean(name = "transactionManagerUser") public PlatformTransactionManager transactionManagerUser(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryUser(builder).getObject()); } }
package com.conf.datasource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.Map; @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryBusiness", transactionManagerRef = "transactionManagerBusiness", //TODO 设置repository所在位置 basePackages = {"com.zwl.repository.secondary"}) public class SecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Bean(name = "entityManagerBusiness") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryBusiness(builder).getObject().createEntityManager(); } @Bean(name = "entityManagerFactoryBusiness") public LocalContainerEntityManagerFactoryBean entityManagerFactoryBusiness(EntityManagerFactoryBuilder builder) { return builder .dataSource(secondaryDataSource) .properties(getVendorProperties()) //TODO 设置实体类所在位置 .packages("com.zwl.model.secondary") .persistenceUnit("businessPersistenceUnit") .build(); } private Map<String, Object> getVendorProperties() { return hibernateProperties.determineHibernateProperties(jpaProperties.getProperties(), new HibernateSettings()); } @Bean(name = "transactionManagerBusiness") PlatformTransactionManager transactionManagerBusiness(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryBusiness(builder).getObject()); } }
com
- > zwl
- - > model
- - - > primary
- - - > secondory
- - > repository
- - - > primary
- - - > secondory
repository
public interface KeywordsRepository extends PagingAndSortingRepository<Keywords,Integer> {
}
model
@Entity public class Keywords { @Id @GeneratedValue(strategy= GenerationType.IDENTITY) private Integer id; private String keyword; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getKeyword() { return keyword; } public void setKeyword(String keyword) { this.keyword = keyword; } public Keywords() { } }
收工总结
1.pom项目搭建
2.application.properties文件或者yml参数编写
3.DruidDBConfig数据源配置
4.PrimaryConfig主数据源配置
5.SecondaryConfig从数据源配置
6.model及repository编写
7.测试收工
题外话(旧版本配置)
Spring Boot 1.5.x
private Map<String, String> getVendorProperties() {
return jpaProperties.getHibernateProperties(userDataSource);
}
Spring Boot 2.0.x
private Map<String, Object> getVendorProperties() {
return jpaProperties.getHibernateProperties(new HibernateSettings());
}
2.1版本参照上文
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。