【发布时间】:2013-01-30 22:48:18
【问题描述】:
我有一个 Web 服务,它在初始化时使用数据源实例化单个 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 时,我应该:
- 为每个请求使用单个
QueryRunner实例? (我是什么 现在做) - 为每个 servlet 请求实例化一个新的
QueryRunner? - 为每个请求使用单个
AsyncQueryRunner实例?
【问题讨论】:
-
我想弄清楚这是否是一个瓶颈。这是不可能的。 QueryRunner 是一个线程安全的类,您可以对所有请求使用单个 QueryRunner。 AsyncQueryRunner 使用 ThreadPool 处理每一个查询,但不是正常情况,它只用于长查询花费。
标签: java object servlets instantiation apache-commons-dbutils