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如何一起使用?

如何使用 JOOQ 和 Spring-boot 2.0 进行手动事务管理?

未从 application.properties 中提取 Spring Boot JOOQ sql 方言