如何将daoimpl函数与dslcontext jooq结合使用

mkh04yzy  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(381)

我们注意到在我们的软件中随机删除数据库连接(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));
        }
    };
}
但仍不确定如何正确使用该上下文。
nfeuvbwi

nfeuvbwi1#

我怀疑这个问题导致了您观察到的副作用,我可以在您的代码中发现:

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 拥有一个与租户生命周期,甚至是应用程序生命周期相对应的生命周期,这样就不必担心再次设置此资源。

相关问题