我们注意到在我们的软件中随机删除数据库连接(postgres)。通过搜索jooq文档,我发现set()方法在初始化之后的每次调用都可能会删除整个框架的线程安全性。
因此,我的方法是重构basedao中的每个方法,去掉setconfiguration()函数并更改为dslcontext。
例如
public TransactionalCallable<Optional<T>> get(I id) {
return cfg -> {
try {
base.setConfiguration(cfg);
return doGet(id).map(p -> Optional.of(from(p))).orElse(Optional.empty());
} finally {
base.setConfiguration(null);
}
};
}
protected Optional<E> doGet(I id) {
return Optional.ofNullable(base.findById(id));
}
``` `base` 是daoimpl的示例。
那么我该如何实施呢 `base.findById(id)` 使用DSL上下文?我是否理解有关线程安全的问题?
编辑:我是这样开始的
public TransactionalCallable<Optional> get(I id) {
return cfg -> doGet(id).run(cfg).map(p -> Optional.of(from(p))).orElse(Optional.empty());
}
protected TransactionalCallable<Optional<E>> doGet(I id) {
return cfg -> {
try (DSLContext context = using(cfg)) {
return Optional.ofNullable(base.findById(id));
}
};
}
但仍不确定如何正确使用该上下文。
1条答案
按热度按时间nfeuvbwi1#
我怀疑这个问题导致了您观察到的副作用,我可以在您的代码中发现:
... 您在每个事务中只执行一次,每个租户只应执行一次:在某些上下文中设置配置。
这是一个生命周期问题。你好像在共享资源(
base
)跨事务处理。如果这是一个共享资源,则不能在每个事务中修改它。这应该是可能的base
拥有一个与租户生命周期,甚至是应用程序生命周期相对应的生命周期,这样就不必担心再次设置此资源。