jOOQ DSLContext:使用 Spring 更正自动装配
jOOQ DSLContext: Correct autowiring with Spring
我不确定我是否 this 正确:
"... jOOQ's Configuration is not necessarily threadsafe, and queries are "attached" to their creating 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,这通过 ThreadLocal
解决了问题,以保证从事务感知数据源返回的 Connection
引用代理不在线程/事务之间共享。
这个...
jOOQ's Configuration is not necessarily threadsafe
...只是意味着实现者(例如 ConnectionProvider
)不需要提供线程安全的实现,这意味着 Configuration
也不能保证线程安全。
我不确定我是否 this 正确:
"... jOOQ's Configuration is not necessarily threadsafe, and queries are "attached" to their creating 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,这通过 ThreadLocal
解决了问题,以保证从事务感知数据源返回的 Connection
引用代理不在线程/事务之间共享。
这个...
jOOQ's Configuration is not necessarily threadsafe
...只是意味着实现者(例如 ConnectionProvider
)不需要提供线程安全的实现,这意味着 Configuration
也不能保证线程安全。