Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DBUtils QueryRunner实例化_Java_Object_Servlets_Instantiation_Apache Commons Dbutils - Fatal编程技术网

Java DBUtils QueryRunner实例化

Java DBUtils QueryRunner实例化,java,object,servlets,instantiation,apache-commons-dbutils,Java,Object,Servlets,Instantiation,Apache Commons Dbutils,我有一个Web服务,它在初始化时用一个数据源实例化一个单一的Web服务。它将这个QueryRunner对象作为servlet上下文属性传递给来自webapp使用的多个不同servlet的所有servlet请求。即: // in servlet context listener (on app initialization) QueryRunner myQueryRunner = new QueryRunner(myDataSource); myServletContext.setAttribut

我有一个Web服务,它在初始化时用一个数据源实例化一个单一的Web服务。它将这个
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

当我四处寻找答案时,我也发现了这个。但我更困惑了,因为API文档中的解释和所说的完全一样

我查看了这些示例,似乎应该在每个请求中实例化它,但我不确定这是否只是因为它是示例代码

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

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

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

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

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

    AsyncQueryRunner也是线程安全的,但其用途和用法完全不同(请参阅)。它用于为长时间运行的语句创建非阻塞调用。如果您的业务层需要是异步的,那么它可能很有用

    总之:

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

    我正在试图找出这是否是一个瓶颈。这是不可能的。QueryRunner是一个线程安全类,您可以对所有请求使用单个QueryRunner。AsyncQueryRunner使用ThreadPool来处理每个查询,但这与正常情况不同,它只用于长查询。