jooQ spring boot Multiple Schema(读写拆分)
Posted
技术标签:
【中文标题】jooQ spring boot Multiple Schema(读写拆分)【英文标题】:jooQ spring boot Multiple Schema(Read Write Split) 【发布时间】:2017-09-01 12:03:32 【问题描述】:我想将 jooQ 与 spring boot 一起使用。我有主从架构,所以我想将 jooQ 与主从架构一起使用(主用于写入,从属用于读取)。
我应该如何进行。现在我正在使用 pom.xml 来配置 jooQ
<configuration>
<jdbc>
<driver>com.mysql.jdbc.Driver</driver>
<url>$datasource.primary.url</url>
<user>$datasource.primary.username</user>
<password>$datasource.primary.password</password>
</jdbc>
<generator>
<name>org.jooq.util.DefaultGenerator</name>
<database>
<name>org.jooq.util.mysql.MySQLDatabase</name>
<includes>.*</includes>
<excludes/>
<inputSchema>jpa</inputSchema>
</database>
<generate>
<deprecated>false</deprecated>
</generate>
<target>
<packageName>com.gensrc.model</packageName>
<directory>src/main/java</directory>
</target>
</generator>
</configuration>
然后只是自动装配 DSLContext
但是我现在如何更改我的代码。
【问题讨论】:
你到底想做什么?我怀疑您有两个用户或模式或数据库(一个用于写入,一个用于读取),但是它们之间的关系如何,您希望 jOOQ 做什么? - “但是我现在如何更改我的代码” - 你的意思是什么代码? 我在两台不同的服务器上有两个不同的数据库。两者都是彼此的复制品。一个用于读取(从),另一个用于写入(主)。我想将我所有的写入查询路由到主服务器,并将我所有的读取查询路由到从服务器。 【参考方案1】:来自您的 cmets:
我想将我所有的写入查询路由到主服务器,并将我所有的读取查询路由到从服务器。
我不太确定 write=master 和 read=slave 之间的这种硬性区别是否是一个好主意。有时,您可能还需要在相同的事务边界内从主服务器读取数据(即读回未提交的数据),以防将读取查询发送到从服务器会产生错误的结果。
因此,实现此路由的最佳位置是拥有单独的DataSource
实例并将它们相应地注入到 jOOQ 中。然后,您将在服务层中显式地、透明地分离主从服务器。
当然,您可以通过使用 jOOQ ExecuteListener
并根据查询类型 (ExecuteContext.type()
) 为 jOOQ 提供正确的 JDBC Connection
来实现您的原始要求,但同样,我认为这会中断很快。
【讨论】:
是的,我知道这种方法基本上是创建两个数据源然后注入 jooQ。但是我如何将数据源注入 jooQ。我目前正在自动装配正在获取主要数据源的 DSLContext。我尝试使用 @Qualifier 初始化 DSLContext 但它没有被初始化。可以分享一下代码吗? 是的,这是使用 master 进行读写事务的常见场景,如果我能够将 Data Soucre 注入 JooQ DSLContext,也可以这样做。 @AnkitBansal:您有很多问题 :) 但没有一个问题出现在您的实际问题文本中。您是否介意针对您拥有的每个问题陈述在 Stack Overflow 上提出一个新问题?如果有疑问,这里有一个解释 Stack Overflow 工作原理的方便页面:***.com/tour @LukasEder 我们正在使用 2 个 dslContext。Writer
是 Spring 自动配置提供的默认 dslContext。 Reader
dslContext 我们通过派生具有不同DataSource
的默认上下文的现有配置来创建。只是想知道,是否有任何最佳实践,因为它使用的是 ExecuteListener、TransactionListener 等相同的对象。由于我们的阅读器数据源无法执行事务,是否可以将 SpringTransactionProvider
用于阅读器?为什么我要问,我想要最少的配置。
@LukasEder 这里是***.com/q/68260908/7857701以上是关于jooQ spring boot Multiple Schema(读写拆分)的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot with JOOQ 和 Spring Data JPA 之间的技术差异
使用 Spring Boot 进行 JOOQ SQL 语法转换
带有 JOOQ 的 Spring Boot 收到一条消息“需要一个找不到的 'org.jooq.DSLContext' 类型的 bean”
Spring boot、JOOQ和Flyway如何一起使用?