【发布时间】:2020-10-02 01:43:08
【问题描述】:
我们注意到在我们的软件中随机删除了数据库连接 (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 的一个实例。
那么我将如何使用 DSLContext 实现base.findById(id)?
我对线程安全的理解有误吗?
编辑:我从这样的东西开始
public TransactionalCallable<Optional<T>> 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));
}
};
}
但仍然不确定如何正确使用该上下文。
【问题讨论】:
-
你为什么要设置配置?理想情况下,您只需设置一次配置和 daos,并且永远不会再篡改配置状态...从您的问题来看,不清楚您做错了什么具体,但看起来您确实在做一些不必要的东西,包括例如将
DSLContext包装在try-with-resources中,这对您的情况没有任何作用... -
主要是因为每个租户都有自己的数据库,配置不同。此外,因为系统可以即时产生新的租户。我想到了不同的方法,比如为每个租户拥有一个 DAO 实例,拥有自己的配置。尽管如此,我希望以某种方式使用 DSLContext 来完成。我知道试用部分不是必需的。这就是我认为我可以使用上下文来使用该上下文执行 findbyid() 函数的方法。我非常同意,最好的办法是不要与国家发脾气。也许我最终必须找到一种方法来做到这一点。
标签: java sql thread-safety jooq