Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.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/5/sql/83.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 多线程并行查询中的ResultsThandler问题_Java_Sql_Multithreading_Callable_Apache Commons Dbutils - Fatal编程技术网

Java 多线程并行查询中的ResultsThandler问题

Java 多线程并行查询中的ResultsThandler问题,java,sql,multithreading,callable,apache-commons-dbutils,Java,Sql,Multithreading,Callable,Apache Commons Dbutils,我正试图从一个Java应用程序在Oracle数据库中并行进行几个读取查询。我使用CallableTasks进行这些查询。可调用任务的示例如下所示: 公共类MyCallableTask实现可调用{ 私有字符串sql; 专用连接; 私家阶级; 公共MyCallableTask(字符串sql、连接、类classInstance){ //连接对象是从db连接池发送到这里的,因此每个可调用对象都有自己的连接实例。 这个连接=连接; this.sql=sql; this.classInstance=clas

我正试图从一个Java应用程序在Oracle数据库中并行进行几个读取查询。我使用CallableTasks进行这些查询。可调用任务的示例如下所示:

公共类MyCallableTask实现可调用{
私有字符串sql;
专用连接;
私家阶级;
公共MyCallableTask(字符串sql、连接、类classInstance){
//连接对象是从db连接池发送到这里的,因此每个可调用对象都有自己的连接实例。
这个连接=连接;
this.sql=sql;
this.classInstance=classInstance;
}
@凌驾
公共列表调用()引发异常{
PreparedStatement ps=connection.createPreparedStatement(sql);
结果集rs=ps.executeQuery();
//使用commons dbutils resultsethandler将结果集映射到Java Bean
ResultSetHandler ResultSetHandler=新BeanListHandler(classInstance);
List requiredList=resultSetHandler.handle(rs);
返回所需列表;
}
}
我的示例主类如下所示:

公共类MyMain{
公共静态void main(){
MyConnectionPool MyConnectionPool=新的MyConnectionPool();
connection1=myConnectionPool.getConnection();
connection2=myConnectionPool.getConnection();
String studentSql=“从AB学生中选择X,Y,其中Z=2”;
String teacherSql=“从AB.教师中选择P,Q,其中R=1”;
ExecutorService ExecutorService=Executors.newFixedThreadPool(6);
Callable callableStudents=新的MyCallableTask(studentSql,connection1,Student.class);
Callable callableTeachers=新的MyCallableTask(teacherSql,connection2,Teacher.class);
未来学生未来=executorService.submit(可调用学生);
未来教师未来=executorService.submit(可调用教师);
List students=studentsFuture.get();
List teachers=teachersFuture.get();
System.out.println(学生+“”+教师);
}
}
正如预期的那样,上面的代码在两个不同线程上为每个sql查询工作,但在我调用的行上失败

List requiredList=resultSetHandler.handle(rs);
引发的异常是NoTouchElementException。我对这个案例感到好奇,因为当我同步运行上面的程序时,它工作得非常好。事实上,即使我插入断点并在调试模式下运行,它也运行得非常好,并按预期创建了两个不同的工作线程。但在正常运行中,它总是会中断

如果可能的话,请尝试回答。非常感谢您的帮助