如何在 DSLContext JOOQ 中使用 DaoImpl 函数
How to use DaoImpl functions with DSLContext JOOQ
我们注意到我们的软件中随机删除了数据库连接 (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));
}
};
}
但仍然不确定如何正确使用该上下文。
我怀疑这个问题导致了您观察到的副作用,我可以在您的代码中发现这些副作用:
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);
}
};
}
...是您在每个事务中执行一次操作,每个租户只应执行一次操作:在某些上下文中设置配置。
这是一个生命周期问题。您似乎在跨事务共享资源 (base
)。如果这是共享资源,则不得在每个事务中对其进行修改。这个base
应该可以有一个对应于租户生命周期,甚至是应用程序生命周期的生命周期,这样就不用担心再次设置这个资源了。
我们注意到我们的软件中随机删除了数据库连接 (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));
}
};
}
但仍然不确定如何正确使用该上下文。
我怀疑这个问题导致了您观察到的副作用,我可以在您的代码中发现这些副作用:
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);
}
};
}
...是您在每个事务中执行一次操作,每个租户只应执行一次操作:在某些上下文中设置配置。
这是一个生命周期问题。您似乎在跨事务共享资源 (base
)。如果这是共享资源,则不得在每个事务中对其进行修改。这个base
应该可以有一个对应于租户生命周期,甚至是应用程序生命周期的生命周期,这样就不用担心再次设置这个资源了。