由于项目需要,最近研究了一下基于弹簧引导与弹簧数据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的多数据源配置