【问题标题】:How to use DaoImpl functions with DSLContext JOOQ如何在 DSLContext JOOQ 中使用 DaoImpl 函数
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2018-04-13
    • 2015-03-02
    • 1970-01-01
    • 2021-08-03
    • 2023-02-23
    • 2015-12-27
    • 2021-07-22
    • 2013-11-20
    相关资源
    最近更新 更多