详解基于弹簧引导与弹簧数据JPA的多数据源配置

  

由于项目需要,最近研究了一下基于弹簧引导与弹簧数据JPA的多数据源配置问题。以下是传统的单数据源配置代码。这里使用的是春天的注释在代码内部直接配置的方式,没有使用任何XML文件。

        @ configuration   @EnableJpaRepositories (basePackages=皁rg.lyndon.repository”)   @EnableTransactionManagement   @PropertySource(“类路径:application.properties”)   公开课JpaConfig {      私有静态最终字符串DATABASE_DRIVER=癲b.driver”;   私有静态最终字符串DATABASE_URL=癲b.url”;   私有静态最终字符串DATABASE_USER=癲b.user”;   私有静态最终字符串DATABASE_PASSWORD=癲b.password”;   私有静态最终字符串PACKAGES_TO_SCAN=皃ackages.to.scan”;   私有静态最终字符串HIBERNATE_DIALECT=癶ibernate.dialect”;   私有静态最终字符串HIBERNATE_SHOW_SQL=癶ibernate.show.sql”;      @   私人环境env;      @ bean   公共数据源的数据源(){=new DruidDataSource DruidDataSource来源();   source.setDriverClassName (env.getRequiredProperty (DATABASE_DRIVER));   source.setUrl (env.getRequiredProperty (DATABASE_URL));   source.setUsername (env.getRequiredProperty (DATABASE_USER));   source.setPassword (env.getRequiredProperty (DATABASE_PASSWORD));   返回源;   }      @ bean   公共LocalContainerEntityManagerFactoryBean被(){   LocalContainerEntityManagerFactoryBean工厂=new LocalContainerEntityManagerFactoryBean ();   factory.setDataSource(数据源());   factory.setPersistenceProviderClass (HibernatePersistenceProvider.class);   factory.setPackagesToScan (env.getRequiredProperty (PACKAGES_TO_SCAN));   factory.setJpaProperties (hibernateProperties ());   factory.afterPropertiesSet ();   返回工厂;   }      @ bean   公共PlatformTransactionManager transactionManager () {   JpaTransactionManager经理=new JpaTransactionManager ();   manager.setEntityManagerFactory(被).getObject ());   返回经理;   }      @ bean   公共HibernateExceptionTranslator HibernateExceptionTranslator () {   返回新HibernateExceptionTranslator ();   }      私有财产hibernateProperties () {   属性=new属性();   属性。把(HIBERNATE_DIALECT env.getRequiredProperty (HIBERNATE_DIALECT));   属性。把(HIBERNATE_SHOW_SQL env.getRequiredProperty (HIBERNATE_SHOW_SQL));   返回属性;   }      }   之前      

但是这一配置是不能简单地扩展到多数据源配置的,因为弹簧引导默认会为开发人员做很多工作,而这些工作与多数据源的配置相冲突,因此需要修改原来的配置内容。网上有很多讲解多数据源配置的文章,但是这些文章大多使用的是XML配置的方式,而且没有使用弹簧引导等比较新春天的框架技术(比如很多人使用实现AbstractRoutingDataSource这一春天提供的抽象类的方式,还需要切面的支持,无疑是相当繁琐的),已经不适用于在最新的工程项目中使用了,因为最新春天的框架可以为我们完成很多事情,我们只需要去适应新的方法即可。为此,我通过研究春天的官方文档和不断调试,实现了新的多数据源配置的方法,在此贴出,仅供参考。
  

  

首先,春天的JPA是直接支持多数据源配置的,因此我们可以在配置文件或者代码中直接配置多个数据源。由于多数据源配置可能会共享一些配置信息,因此使用继承体系实现这种配置是最合适的。在例子中,我的ORM框架使用的是冬眠,而与hibernate相关的配置信息我都放在了配置基类BaseJpaConfg中,代码如下。

        @ configuration   @EnableTransactionManagement   @PropertySource(“类路径:application.properties”)   公开课BaseJpaConfig {      私有静态最终字符串HIBERNATE_DIALECT=癶ibernate.dialect”;   私有静态最终字符串HIBERNATE_SHOW_SQL=癶ibernate.show.sql”;      @   保护环境env;      @ bean   公共HibernateExceptionTranslator HibernateExceptionTranslator () {   返回新HibernateExceptionTranslator ();   }      受保护的属性hibernateProperties () {   属性=new属性();   属性。把(HIBERNATE_DIALECT env.getRequiredProperty (HIBERNATE_DIALECT));   属性。把(HIBERNATE_SHOW_SQL env.getRequiredProperty (HIBERNATE_SHOW_SQL));   返回属性;   }      }      之前      

该类提供Hibernate相关信息。它有两个子类,分别是SpringJpaConfig以及MysqlJpaConfig,分别配置了两个数据源,连接到两个不同的数据库模式,代码如下。

详解基于弹簧引导与弹簧数据JPA的多数据源配置