解决spring boot 1.5.4 配置多数据源的问题
spring boot 已经支持多数据源配置了,无需网上好多那些编写什么类的,特别麻烦,看看如下解决方案,官方的,放心!
1.首先定义数据源配置
#=====================multiple database config============================ #ds1 first.datasource.url=jdbc:mysql://localhost/test?characterencoding=utf8&usessl=true first.datasource.username=root first.datasource.password=123456 first.datasource.driver-class-name=com.mysql.jdbc.driver first.datasource.type=org.apache.tomcat.jdbc.pool.datasource first.datasource.max-wait=10000 first.datasource.max-active=200 first.datasource.test-on-borrow=true first.datasource.initial-size=10 #ds2 second.datasource.url=jdbc:mysql://localhost/test2?characterencoding=utf8&usessl=true second.datasource.username=root second.datasource.password=123456 second.datasource.driver-class-name=com.mysql.jdbc.driver second.datasource.type=org.apache.tomcat.jdbc.pool.datasource second.datasource.max-wait=10000 second.datasource.max-active=200 second.datasource.test-on-borrow=true second.datasource.initial-size=10 #=====================jpa config================================ #实体类维护数据库表结构的具体行为:update/create/create-drop/validate/none spring.jpa.hibernate.ddl-auto=none #打印sql语句 spring.jpa.show-sql=true #格式化输出的json字符串 spring.jackson.serialization.indent_output=true
2.配置ds1的相关注入对象和启用jpa支持
/** * created by hdwang on 2017-06-16. * 第一个数据源配置 * if you are using spring data, you need to configure @enablejparepositories */ @configuration @enabletransactionmanagement @enablejparepositories(basepackages = "com.hdwang.dao.datajpa.firstds",entitymanagerfactoryref = "firstentitymanagerfactory",transactionmanagerref="firsttransactionmanager") public class firstdsconfig { /** * 数据源配置对象 * primary 表示默认的对象,autowire可注入,不是默认的得明确名称注入 * @return */ @bean @primary @configurationproperties("first.datasource") public datasourceproperties firstdatasourceproperties() { return new datasourceproperties(); } /** * 数据源对象 * @return */ @bean @primary @configurationproperties("first.datasource") public datasource firstdatasource() { return firstdatasourceproperties().initializedatasourcebuilder().build(); } /** * 实体管理对象 * @param builder 由spring注入这个对象,首先根据type注入(多个就取声明@primary的对象),否则根据name注入 * @return */ @bean @primary public localcontainerentitymanagerfactorybean firstentitymanagerfactory( entitymanagerfactorybuilder builder) { return builder .datasource(firstdatasource()) .packages("com.hdwang.entity.dbfirst") .persistenceunit("firstds") .build(); } /** * 事务管理对象 * @return */ @bean(name = "firsttransactionmanager") @primary public platformtransactionmanager transactionmanager(entitymanagerfactory emf){ jpatransactionmanager transactionmanager = new jpatransactionmanager(); transactionmanager.setentitymanagerfactory(emf); return transactionmanager; } @bean @primary public jdbctemplate jdbctemplate(){ return new jdbctemplate(firstdatasource()); } @bean @primary public transactiontemplate transactiontemplate(platformtransactionmanager platformtransactionmanager){ return new transactiontemplate(platformtransactionmanager); } }
相关知识点:
1.使用@bean可以创建一个bean对象交给spring容器管理
2.@bean创建的bean对象的名称默认为方法名,也可以指定
3.@bean方法参数表示,接收一个bean对象,默认按照type类型接收注入的对象,若要修改为byname方式,可以使用@qualifier注解注入准确的对象
4.@primary表示该bean为此类型的默认bean,在其他地方引用的时候用@autowired即可按照类型注入,不受同类型多个对象影响
5.enablejparepositories表示启用spring data jpa的支持,也就是jpa的新使用方式,注意basepackages指的事 @repository接口的所在包位置,可配置多个
其他注解就不清楚了!
2.配置ds2的相关注入对象和启用jpa支持
@configuration @enabletransactionmanagement @enablejparepositories(basepackages = "com.hdwang.dao.datajpa.secondds", entitymanagerfactoryref = "secondentitymanagerfactory",transactionmanagerref = "secondtransactionmanager") public class seconddsconfig { @bean @configurationproperties("second.datasource") public datasourceproperties seconddatasourceproperties() { return new datasourceproperties(); } @bean @configurationproperties("second.datasource") public datasource seconddatasource() { return seconddatasourceproperties().initializedatasourcebuilder().build(); } /** * 实体管理对象 * @param builder 由spring注入这个对象,首先根据type注入(多个就取声明@primary的对象),否则根据name注入 * @return */ @bean public localcontainerentitymanagerfactorybean secondentitymanagerfactory( entitymanagerfactorybuilder builder) { return builder .datasource(seconddatasource()) .packages("com.hdwang.entity.dbsecond") .persistenceunit("secondds") .build(); } /** * 事物管理对象 * @param secondentitymanagerfactory 实体管理工厂对象(按照名称注入) * @return 平台事物管理器 */ @bean(name = "secondtransactionmanager") public platformtransactionmanager transactionmanager(@qualifier("secondentitymanagerfactory")localcontainerentitymanagerfactorybean secondentitymanagerfactory){ jpatransactionmanager transactionmanager = new jpatransactionmanager(); transactionmanager.setentitymanagerfactory(secondentitymanagerfactory.getobject()); return transactionmanager; } @bean(name="jdbctemplate2") public jdbctemplate jdbctemplate(){ return new jdbctemplate(seconddatasource()); } @bean(name = "transactiontemplate2") public transactiontemplate transactiontemplate(@qualifier("secondtransactionmanager")platformtransactionmanager transactionmanager){ return new transactiontemplate(transactionmanager); } }
3.repository数据持久层
package com.hdwang.dao.datajpa.firstds; @repository public interface userrepository extends jparepository<user, integer> { /** * spring data jpa 会自动注入实现(根据方法命名规范) * @return */ user findbynumber(string number); @modifying @query("delete from user u where u.id = :id") void deleteuser(@param("id")int id); }
package com.hdwang.dao.datajpa.secondds; @repository public interface orderrepository extends jparepository<order, integer> { /** * spring data jpa 会自动注入实现(根据方法命名规范) * @return */ user findbynumber(string number); @modifying @query("delete from order o where o.id = :id") void deleteuser(@param("id") int id); }
上面两个接口分属两个数据源,在@enablejparepositories配置好后,这里就可以正确操作相应的数据源了
4.service服务层,注意事物(接口我就不贴了)
@service @transactional("firsttransactionmanager") public class userserviceimpl implements userservice { @autowired private userrepository userrepository; @override public user findbyid(int id) { return this.userrepository.findone(id); } @override public user findbynumber(string number) { return this.userrepository.findbynumber(number); } @override public list<user> findalluserbypage(int page,int size) { pageable pageable = new pagerequest(page, size); page<user> users = this.userrepository.findall(pageable); return users.getcontent(); } @override public user updateuser(user user,boolean throwex) { user usernew = this.userrepository.save(user); if(throwex){ throw new runtimeexception("throw a ex"); } return usernew; } @override public void deleteuser(int id) { this.userrepository.deleteuser(id); } }
@service @transactional("secondtransactionmanager") public class orderserviceimpl implements orderservice { @autowired private orderrepository orderrepository; @override public order findbyid(int id) { return this.orderrepository.findone(id); } @override public order updateorder(order order, boolean throwex) { order ordernew = this.orderrepository.save(order); if(throwex){ throw new runtimeexception("throw a ex"); } return ordernew; } }
知识扩展
1.如果采用传统jpa方式,@enablejparepositories无需配置,配置了也无影响。实现方式如下:
ds1相关daoimpl
@persistencecontext
private entitymanager entitymanager;
ds2相关daoimpl
@persistencecontext(unitname = "secondds")
private entitymanager entitymanager;
因为ds1的entitymanger声明了@primary,所以无需指明unitname,ds2必须指明。注入了准确的entitymanager,就可以直接拿来操作数据库了。service层和上面一样的,@transactional("xxxmanager")指明事物管理器即可!
2.采用jdbctemplate方式,直接注入到service层对象即可,so easy!
@autowired
private jdbctemplate jdbctemplate;
@autowired
private transactiontemplate transactiontemplate;
@resource(name="jdbctemplate2")
private jdbctemplate jdbctemplate2;
@resource(name="transactiontemplate2")
private transactiontemplate transactiontemplate2;
好了,spring boot 多数据源,完美解决! 而且三种数据库操作方法均支持,包括事物。已经经过实践证明了! 这是官方给出的最佳实践,只是官方文档没写细。导致整整坑了我几天。至此,spring boot框架的使用就告一段落了!
以上这篇解决spring boot 1.5.4 配置多数据源的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
推荐阅读
-
解决spring boot 1.5.4 配置多数据源的问题
-
Java Spring boot 2.0 跨域问题的解决
-
spring boot使用i18n时properties文件中文乱码问题的解决方法
-
spring boot 本地图片不能加载(图片路径)的问题及解决方法
-
Java Spring boot 2.0 跨域问题的解决
-
解决Intellij IDEA 使用Spring-boot-devTools无效的问题
-
spring boot 本地图片不能加载(图片路径)的问题及解决方法
-
spring boot加载资源路径配置和classpath问题解决
-
Spring Boot项目添加外部Jar包以及配置多数据源的完整步骤
-
Spring boot如何快速的配置多个Redis数据源