春季靴将不会引入基础。推荐本实际教程:https://github.com/javastacks/spring-boot-best-practice
首先,我们在Springboot中配置两个数据源。第二个数据源是:
在开发环境中,无需配置主数据库。您只需要为数据库设置两个用户,一个人具有读写权限,一个仅具有选择的权限,该权限模拟了主的读取和写作分离。生产环境中的数据库。
在Springboot的配置代码中,我们初始化了两个数据源:
然后,我们使用Spring的构建-ROUTINGATASOURCE将两个真实的数据源用作动态数据源:
为此,您需要在Springboot中的主要数据源中进行配置并将其设置为:
现在,配置了RoutingDatasource,但是路线的选择已写下,即永远返回,
现在的问题是:如何存储动态选择密钥,密钥在哪里?
在Servlet的线程模型中,最适合使用ThreadLocal存储键。因此,我们编写一个RoutingAtasourceContext来设置并动态存储密钥:
然后,修改routingatAsource,并按照以下方式获取密钥的代码:
这样,在某个地方(例如控制器方法)中,您可以动态设置数据源的关键:
到目前为止,我们已经成功地意识到了数据库的动态路由访问。
此方法是可行的,但是您需要从数据库中读取的地方,您需要添加大量代码,这很不便,可以简化吗?
有!
如果我们仔细考虑一下,只需要春季声明性交易管理提供的注释。使用Java方法,此方法自动具有交易。
我们还可以编写类似的注释,将其放在控制器的方法上,并在此方法中自动选择相应的数据源。代码看起来像这样:
这样,根本不修改应用程序的逻辑,并且仅将注释添加到必要的位置,以自动实现动态数据源开关。此方法是最简单的。
如果您想在应用程序中编写较少的代码,我们必须做更多的基础工作:我们必须使用类似Spring的机制来实现声明-Type交易,也就是说,AOP使用AOP来切换动态数据源。
实现此功能也非常简单。写一个并使用aptivej实现拦截:
请注意,该方法的第二个参数是Spring的注释实例,我们根据注释获得配置密钥。您需要在编译之前添加MAVEN依赖性:
到目前为止,我们已经意识到用注释选择数据源的功能。最后一步重组是用字符串的常数代替和平。
由于servlet线程模型的限制,在请求中设置后无法修改动态数据源,也就是说,它不能嵌套。加上混合时,将其设置为AOP的优先级。
本文的代码需要Springboot支持。JDK 1.8编译并打开汇编参数。
资料来源:www.liaoxuefeng.com