为了提高应用程序的可靠性,现在许多数据源也很普遍。数据库可以构建双M结构。这首歌兄弟还向您发布了文档,如何使用双M结构构建双M结构?那么,您如何在Java代码中操作大量数据?
在19年的时间里,我写了几篇文章来教您以配置JDBCTEMPLATE,MYBATIS和JPA中的大多数数据(公共帐户Jiangnan在666的背景下有很少的相关信息),但是这些信息的总体想法的整体思想是文章是mademultiple dao层实例,然后您选择要手动使用的实例,因此不方便。
Mybatis-Plus还提供相应的工具,感兴趣的朋友可以尝试自己。
今天,我想带领我的朋友使用AOP的想法来我自己编写一个简单的数据切换工具。
如果要自定义动态数据源开关,则必须首先了解一个类:
它是在Spring2.0.1中引入的(请注意,Spring2.0.1不是Spring boot2.0.1,因此这实际上是Spring的非常古老的功能)。该类充当DataSource的路由中介。某些键值被动态切换到真实的数据源。
粗略的用法是,您预先准备了各种数据源,存储在地图中,地图的关键是此数据源的名称,地图的值是此特定数据源,然后将此地图配置为中间。最后,无论执行数据库查询,都要执行数据库查询,然后取出键并找到执行数据库操作的特定数据源。
这是一般的想法。
让我们看一下如何玩。
首先,我们创建一个春季启动项目,介绍Web,Mybatis和MySQL依赖性。成功创建项目后,然后手动添加DRUID和AOP依赖项,如下所示:
实际上,关于这一点无话可说,所有这些都是常规的行动。
接下来,我们创建一个application-druid.yaml来配置我们的数据源信息,如下:
这是德鲁伊的常规配置,无话可说。唯一需要注意的是我们整个配置文件的格式。DS配置了我们所有的数据源。每个数据源都有一个名称。主是默认数据源的名称。它无法修改。其他数据源可以自定义名称。最后,我们还配置了Druid的监视功能。如果朋友不了解Druid的监视功能,您可以检查Spring Boot如何监视SQL的操作?Essence
但是,朋友知道YAML配置不像可以通过注释加载自定义配置文件的属性配置,并且YAML配置没有类似的加载机制。我们可以使用Spring Boot的配置文件机制加载此自定义application-druid.yaml配置文件。特定方法是在应用程序中添加配置行。yaml:如下:如下:
接下来,我们还需要提供配置类,以将此配置文件的内容加载到配置类中,如下:
关于此配置类别,没有什么可说的。我们配置的多个数据源将在名为DS的地图中读取它。将来,我们将基于此地图中的数据构建数据源。
接下来,我们必须根据配置文件加载数据源。加载方法如下:
加载的核心工作是在YamldynamicDataSourceProvider类中完成的。此类中有一个LoadDataSources方法读取所有数据源对象。数据源的相关属性在DruidProperties对象中。我们首先基于基本数据库连接信息创建一个数据源对象,然后调用这些数据源连接池的其他属性(最大连接,最小免费数字等)配置其他属性的方法。最后,在键值的形式中,数据源存储在地图集合中。每个数据源的关键是您在YAML中配置的数据源名称。
哪个数据源用于当前数据库操作?我们有许多不同的设置。当然,最困难的方法是将当前数据源信息存储到ThreadLocal中。线程局部的特征只是说话。如果更改线程,则无法将其弄清楚,以确保在多线程环境中的数据安全性。
让我们首先参加一个简单的工具类,如下:
接下来,我们自定义注释以标记当前数据源,如下:
将来,该注释将在服务层中添加到服务层。使用此注释时,您需要指定数据源名称。如果未指定,请使用Master用作数据源。
我们还需要通过AOP分析当前的自定义注释,如下所示:
接下来,我们源自动态数据源:
这就是我们在文章开头所说的。该类有一个名为desionecurrentlookupkey的方法。当需要使用数据源时,系统将自动调用该方法以获取当前数据源,例如Master,Master或Slave或其他方法。商标后,您可以相应地获取数据源。
当我们配置DynamicDataSource时,我们需要配置两个关键参数。一个是settargetDataSources。这是所有当前数据源。告诉所有当前的数据源以摘要datatasource。这些数据源是键值的形式(将来(未来未来,您可以根据definecurrentlookupkey方法返回的键获取特定数据源);另一种方法是setDefaultTargetDataSource。这是默认数据源。当默认数据源。如果没有指定的数据源,我们执行数据库操作(例如,服务层的方法(例如,服务层的方法(例如,服务层的方法)(例如,服务层的方法(例如,服务层的方法(例如,服务层的方法(例如,服务层的方法)(服务层的方法(例如,服务层的方法。不@datasource注释),然后默认使用此数据源。
最后,将此豆注册到弹簧容器中,如下:
下面,我们还配置了一个过滤器。该过滤器的目的是在DRUID监视页面上删除Ali的广告。有关具体原则,请参阅Spring Boot的SQL操作?一篇文章。
好吧,您可以做到,让我们重新测试,写一个usermapper:
一个非常简单的数据库查询操作。
这是另一个服务:
特定操作的数据源由注释指定。如果不使用注释指定,则默认情况下使用主数据源。
最后,参加单元测试进行测试,如下所示:
由于我在这里对应于不同的库,因此查询将在此处显示不同的结果。
知道它知道为什么!
好吧,公共帐户jiangnan在背景中有一点降雨回复dynamic_datasource,以获取本文的源代码下载链接。
原始:https://juejin.cn/post/7098116536577032206