我不确定this是否正确:


  “ ... jOOQ的Configuration不一定是线程安全的,查询是“附加”到其创建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 -->


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

最佳答案

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

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

这个...


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


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

10-05 18:45