最近在学sprinJpa,照着网上博客想试着配一下Jpa的多数据源,但发现由于springboot版本过高的问题,网上的demo都不适用,致使找了好久才找到解决办法。如今把操做过程记录以下。mysql
spring: datasource: test1: driver-class-name: com.mysql.jdbc.Driver password: 123456 #url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false #springboot2.0以上 jdbc-url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root test2: driver-class-name: com.mysql.jdbc.Driver password: 123456 #url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false #springboot2.0以上 jdbc-url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root jpa: ## 是否打印sql show-sql: true properties: hibernate: # 指定引擎为Innodb dialect: org.hibernate.dialect.MySQL5InnoDBDialect hbm2ddl: # create: 每次加载 hibernate 时都会删除上一次的生成的表, # 而后根据你的 model 类再从新来生成新表,哪怕两次没有任何改变也要这样执行, # 这就是致使数据库表数据丢失的一个重要缘由。 # create-drop :每次加载 hibernate 时根据 model 类生成表,可是 sessionFactory 一关闭,表就自动删除。 # update:最经常使用的属性,第一次加载 hibernate 时根据 model 类会自动创建起表的结构(前提是先创建好数据库),之后加载 hibernate 时根据 model 类自动更新表结构,即便表结构改变了但表中的行仍然存在不会删除之前的行。要注意的是当部署到服务器后,表结构是不会被立刻创建起来的,是要等 应用第一次运行起来后才会。 # validate :每次加载 hibernate 时,验证建立数据库表结构,只会和数据库中的表进行比较,不会建立新表,可是会插入新值。 auto: update
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Primary @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.test1") public DataSource primaryDataSource() { System.out.println("-------------------- primaryDataSource初始化 ---------------------"); return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.test2") public DataSource secondaryDataSource() { System.out.println("-------------------- secondaryDataSource初始化---------------------"); return DataSourceBuilder.create().build(); } }
数据源1:spring
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactoryPrimary", transactionManagerRef="transactionManagerPrimary", basePackages= { "com.czcstudy.springbootdemo.day1.dao.test1" }) //设置Repository所在位置 public class RepositoryPrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary( EntityManagerFactoryBuilder builder) { //网上文章大多数都是jpaProperties.getHibernateProperties(dataSource);就直接获得了hibernate的配置map, //但这个方法在springboot2.0+好像就舍弃了,因此这里改为这样。 Map<String, Object> properties = hibernateProperties.determineHibernateProperties( jpaProperties.getProperties(), new HibernateSettings()); return builder.dataSource(primaryDataSource).properties(properties) .packages("com.czcstudy.springbootdemo.day1.bean.po").build();//实体包路径 } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); }
数据源2:sql
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactorySecondary", transactionManagerRef="transactionManagerSecondary", basePackages= { "com.czcstudy.springbootdemo.day1.dao.test2" }) //设置Repository所在位置 public class RepositorySecondaryConfig { @Autowired @Qualifier("secondaryDataSource") private DataSource secondaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Bean(name = "entityManagerFactorySecondary") public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary( EntityManagerFactoryBuilder builder) { //网上文章大多数都是jpaProperties.getHibernateProperties(dataSource);就直接获得了hibernate的配置map, //但这个方法在springboot2.0+好像就舍弃了,因此这里改为这样。 Map<String, Object> properties = hibernateProperties.determineHibernateProperties( jpaProperties.getProperties(), new HibernateSettings()); return builder.dataSource(secondaryDataSource).properties(properties) .packages("com.czcstudy.springbootdemo.day1.bean.po").build();//实体的包路径 } @Bean(name = "transactionManagerSecondary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject()); } }
@Service public class JpaTestServiceImpl implements JpaTestService { @Autowired private UserJpaTest2Dao userRepository2; @Override @Transactional(value = "transactionManagerSecondary",rollbackFor = RuntimeException.class) public void test(){ List<UserJpaTest> userJpaTestList = userRepository2.findAll(); System.out.println(userJpaTestList); } }
其中指定的value就是前面注册的PlatformTransactionManager对象名称,多数据源时须要指定。数据库
以上就是springboot2.1.5 配置jpa多数据源的方法,启动项目咱们能够看到springboot
HikariPool链接池已经启动了,这是springboot的默认数据库链接池,因此链接池咱们这里就不本身配了。服务器