maven 文件:
com.alibaba druid 1.1.6 org.springframework.boot spring-boot-starter-log4j 1.3.3.RELEASE org.apache.httpcomponents httpclient com.alibaba fastjson 1.2.33 org.springframework.boot spring-boot-starter-data-jpa ch.qos.logback logback-classic mysql mysql-connector-java 5.1.30 org.apache.hadoop hadoop-client 2.7.3 org.slf4j slf4j-log4j12 log4j log4j javax.servlet servlet-api org.apache.hive hive-jdbc 1.1.0 javax.servlet servlet-api org.apache.geronimo.specs geronimo-jaspic_1.0_spec org.springframework.boot spring-boot-devtools true true org.projectlombok lombok 1.16.10 org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-starter-data-redis redis.clients jedis 2.5.2 org.springframework.boot spring-boot-starter-thymeleaf junit junit 4.12 test org.springframework.data spring-data-jpa org.springframework.data spring-data-commons org.springframework.boot spring-boot-maven-plugin true
基础配置类:
import com.alibaba.druid.pool.DruidDataSource; import java.sql.SQLException; import javax.sql.DataSource; 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.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.jdbc.core.JdbcTemplate; @Configuration public class DruidDBConfig { private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class); @Value("${spring.primary.url}") private String dbUrl1; @Value("${spring.primary.username}") private String username1; @Value("${spring.primary.password}") private String password1; @Value("${spring.secondary.username}") private String username2; @Value("${spring.secondary.password}") private String password2; @Value("${spring.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 primaryDataSource() { return getDruidDataSource(username1, password1, dbUrl1); } @Bean(name = "primaryJdbcTemplate") public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource") DataSource dataSource){ return new JdbcTemplate(dataSource); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @Primary public DataSource secondaryDataSource() { return getDruidDataSource(username2, password2, dbUrl2); } @Bean(name = "secondaryJdbcTemplate") public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource") DataSource dataSource){ return new JdbcTemplate(dataSource); } 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.dataset.management.config; import java.util.Map; import javax.annotation.Resource; import javax.persistence.EntityManager; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; 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; /** * @author */ @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactoryPrimary", transactionManagerRef = "transactionManagerPrimary", basePackages = {"com.dataset.management.PrimaryDao"}) public class PrimaryConfig { @Resource private JpaProperties jpaProperties; @Resource @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Primary @Bean(name = "entityManagerPrimary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryPrimary(builder).getObject().createEntityManager(); } private Map, Object> getVendorProperties() { return jpaProperties.getHibernateProperties(new HibernateSettings()); } /** * 设置实体类所在位置 */ @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(EntityManagerFactoryBuilder builder) { return builder .dataSource(primaryDataSource) .packages("com.dataset.management.entity") .persistenceUnit("primaryPersistenceUnit") .properties(getVendorProperties()) .build(); } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); } }
第二个数据配置:
package com.dataset.management.config; import org.springframework.beans.factory.annotation.Qualifier; 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.annotation.Resource; import javax.persistence.EntityManager; import javax.sql.DataSource; import java.util.Map; @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactorySecondary", transactionManagerRef = "transactionManagerSecondary", basePackages = {"com.dataset.management.SecondaryDao"}) public class SecondaryConfig { @Resource @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Bean(name = "entityManagerSecondary") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactorySecondary(builder).getObject().createEntityManager(); } @Resource private JpaProperties jpaProperties; private Map, Object> getVendorProperties() { return jpaProperties.getHibernateProperties(new HibernateSettings()); } @Bean(name = "entityManagerFactorySecondary") public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(EntityManagerFactoryBuilder builder) { return builder .dataSource(secondaryDataSource) .packages("com.dataset.management.entity") .persistenceUnit("secondaryPersistenceUnit") .properties(getVendorProperties()) .build(); } @Bean(name = "transactionManagerSecondary") PlatformTransactionManager transactionManagerSecondary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }