【问题标题】:jOOQ DSLContext: Correct autowiring with SpringjOOQ DSLContext:使用 Spring 正确自动装配
【发布时间】:2015-12-27 05:20:19
【问题描述】:

我不确定我是否得到this 正确:

"...jOOQ 的配置不一定是线程安全的,查询被“附加”到它们创建的 DSLContext。"

我正在实现Repository Pattern,所以我可以像这样为我的所有存储库自动装配DSLContext吗?

public abstract class AbstractRepository {  

    private DSLContext ctx;

    public AbstractRepository(DSLContext ctx) {
        this.ctx = ctx;
    }

    public DSLContext getCtx() {
        return ctx;
    }
}

public class UserRepositoryImpl implements UserRepository {
    public UserRepositoryImpl(DSLContext ctx) { super(ctx); }
}

public class LoginService eextends AbstractService {

    public UserRepository userRepository ;

    @Autowired
    public LoginService(DSLContext ctx) {    
        this.userRepository = new UserRepositoryImpl(ctx);
    }

    @Transactional
    public UserDTO login(String username, String password) {
        // Check if password is correct ..
        return userDto;
    }
}

我有什么理由不将DSLContext 的相同实例分配给我的所有存储库

<bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="transactionAwareDataSource"
    class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy">
    <constructor-arg ref="dataSource" />
</bean>

<bean class="org.jooq.impl.DataSourceConnectionProvider" name="connectionProvider">
    <constructor-arg ref="transactionAwareDataSource" />
</bean>

<bean id="dsl" class="org.jooq.impl.DefaultDSLContext">
    <constructor-arg ref="config" />
</bean>

<bean class="org.jooq.impl.DefaultConfiguration" name="config">
    <constructor-arg index="0" ref="connectionProvider" />
    <constructor-arg index="1"><null /></constructor-arg>
    <constructor-arg index="2"><null /></constructor-arg>
    <constructor-arg index="3"><null/></constructor-arg>
    <constructor-arg index="4"><null /></constructor-arg>
    <constructor-arg index="5"><value type="org.jooq.SQLDialect">POSTGRES_9_4</value></constructor-arg>
    <constructor-arg index="6"><null /></constructor-arg>
    <constructor-arg index="7"><null /></constructor-arg>
</bean>

<!-- BEGIN Services -->

<bean id="loginService" class="com.mz.server.web.service.LoginService">
    <constructor-arg>
        <ref bean="dsl" />
    </constructor-arg>
</bean>

<!-- END Services -->

而是为每个存储库创建一个新实例?

【问题讨论】:

  • 在我看来我们没有全貌。您能否提供所有存储库的完整布线?
  • @luboskrnac 你好!这并不是关于这里的全貌。我的问题基本上是这是否是线程安全的。但我添加了一个服务,我想用DSLContext 自动连接。
  • 明白了你的意思并创建了答案。
  • 嗯,正如您在我的回答评论中还包括 JOOQ 事务支持,我不得不承认,我不确定 JOOQ 如何与 @Transactional 合作。因此,我删除了我的答案,以便为更合格的答案留出位置。
  • @luboskrnac 好吧!谢谢你的帮助:)

标签: java spring jooq


【解决方案1】:

您的配置很好,因为您已配置的配置对象内部没有敏感状态。

特别是,ConnectionProvider 将连接处理委托给 Spring,后者通过 ThreadLocal 解决问题,以保证从事务感知数据源代理返回的 Connection 引用不会在线程/事务之间共享。

这...

jOOQ 的配置不一定是线程安全的

...只是意味着实现者(例如ConnectionProvider)不需要提供线程安全的实现,这意味着Configuration也不能保证线程安全。

【讨论】:

  • 好的,明白了 :) 我知道我最近问的很多,但我必须快速学习,因为下学期开始我的时间有限 - 所以我可以邀请你看看关于jOOQ and Spring的这个问题?
  • @StefanFalk:不用担心。只要你公开询问,其他人也会获利。稍后我会研究其他问题。
猜你喜欢
  • 2021-10-19
  • 2017-11-15
  • 2013-03-08
  • 2019-04-19
  • 2020-10-02
  • 1970-01-01
  • 2021-08-03
  • 2019-01-14
  • 1970-01-01
相关资源
最近更新 更多