java queryrunner_java – DBUtils QueryRunner实例化

我有一个webservice,在初始化时实例化一个带有数据源的QueryRunner.它将这一个QueryRunner对象用于来自webapp使用的多个不同servlet的所有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.但是我更加困惑,因为QueryRunner和AsyncQueryRunner的API文档中的解释说的完全相同.

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

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

>对每个请求使用一个QueryRunner实例? (我是什么

现在做)

>为每个servlet请求实例化一个新的QueryRunner?

>为每个请求使用一个AsyncQueryRunner实例?

解决方法:

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

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

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

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

结论:

>使用来自多个线程的单个QueryRunner实例(每个请求一个线程?)没有反指示但也没有adavantages,但是需要一些代码来管理这个实例

>为每个线程使用新的QueryRunner实例,甚至对于要通过它委托的每个语句都有两个主要的优点:简单和本地化使用,如果不需要它们,内存中没有实例.

> AsyncQueryRunner需要对查询响应进行繁琐的管理,因此只有在业务代码中需要异步行为时才使用它.

标签:java,object,instantiation,servlets,apache-commons-dbutils

来源: https://codeday.me/bug/20190901/1781724.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值