如何在DSLContext JOOQ中使用DaoImpl函数

fabianski:

我们注意到我们的软件中随机删除了数据库连接(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)使用DSLContext来实现呢?我是否了解有关线程安全的错误信息?

编辑:我开始这样的事情

   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));
            }
        };
    }

但是仍然不确定如何正确使用该上下文。

卢克·埃德(Luke Eder):

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章