gpt4 book ai didi

java - DBUtils QueryRunner实例化

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:51:02 30 4
gpt4 key购买 nike

我有一个实例化单个 QueryRunner 的网络服务在初始化时使用数据源。它通过将这个 QueryRunner 对象作为 servlet 上下文属性传递给 webapp 使用的多个不同 servlet 的所有 servlet 请求。即:

// in servlet context listener (on app initialization)
QueryRunner myQueryRunner = new QueryRunner(myDataSource);
myServletContext.setAttribute("queryRunner", myQueryRunner);

// in the servlets
QueryRunner myQueryRunner = (QueryRunner) myServletContext.getAttribute("queryRunner");
myQueryRunner.query(myStoredProcedure, handler, params)

我想弄清楚这是否是一个瓶颈。 servlet 是否应该针对每个请求实例化一个新的 QueryRunner

在四处寻找答案时,我还发现了这个 AsyncQueryRunner .但我只是变得更加困惑,因为 API 文档中对 QueryRunner 的解释和 AsyncQueryRunner说完全一样的话。

我查看了示例 here并且它似乎应该针对每个请求进行实例化,但我不确定这是否只是因为它是示例代码。

换句话说,当使用 DBUtils QueryRunner 时,我应该:

  1. 对每个请求使用单个 QueryRunner 实例? (我是什么现在做)
  2. 为每个 servlet 请求实例化一个新的 QueryRunner
  3. 对每个请求使用单个 AsyncQueryRunner 实例?

最佳答案

QueryRunner 是一个线程安全类,因为它是无状态的,因此您可以在多线程环境中使用单个实例而不会出现任何问题。

所有方法都是自包含的,因此无需同步方法访问,因此您也可以排除瓶颈。

我在生产环境中使用它没有问题,但我的实现遵循“用每个语句实例化一个新的 QueryRunner”的模式,因为它是一个没有状态的委托(delegate)类,所以没有繁重的初始化,也没有堆消耗,我避免使用单例或其他存储此类类的共享实例。

AsyncQueryRunner 也是线程安全的,但其目的和用法完全不同(参见 http://commons.apache.org/proper/commons-dbutils/examples.html)。它用于为长时间运行的语句创建非阻塞调用。如果您的业务层需要异步,它可能会很有用。

总结:

  • 使用来自多个线程的单个 QueryRunner 实例(每个请求一个线程?)没有反对意见,但也没有优势,但需要在某处使用一些代码来管理此实例
  • 为每个线程使用新的 QueryRunner 实例,甚至为要通过它委托(delegate)的每个语句使用新的 QueryRunner 实例有两个主要优点:简单和本地化使用,如果不需要它们,则没有实例在内存中。
  • AsyncQueryRunner 需要对查询响应进行繁琐的管理,因此仅当您的业务代码中需要异步行为时才使用它。

关于java - DBUtils QueryRunner实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886606/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com