Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 (命名)SQL查询中的括号会使整个应用程序停滞-为什么?_Java_Sql_Jpa_Oracle11g_Eclipselink - Fatal编程技术网

Java (命名)SQL查询中的括号会使整个应用程序停滞-为什么?

Java (命名)SQL查询中的括号会使整个应用程序停滞-为什么?,java,sql,jpa,oracle11g,eclipselink,Java,Sql,Jpa,Oracle11g,Eclipselink,在过去的几个月里,我一直在开发/维护一个Java web服务,该服务使用EclipseLink作为其ORM,与Oracle 11.2.0.1数据库进行通信 上周,Web服务突然完全停止工作。我花了一周时间才找到问题的原因:第一次调用某个命名查询的getResultList方法时,之后什么都没有发生——没有调试输出,没有异常,什么都没有。似乎该方法没有返回任何内容,并且阻止了其他内容。 为了尝试弄清楚问题是否真的是查询造成的,我编写了一个只连接到数据库的最小程序,并在不使用ORM系统的情况下执行查

在过去的几个月里,我一直在开发/维护一个Java web服务,该服务使用EclipseLink作为其ORM,与Oracle 11.2.0.1数据库进行通信

上周,Web服务突然完全停止工作。我花了一周时间才找到问题的原因:第一次调用某个命名查询的getResultList方法时,之后什么都没有发生——没有调试输出,没有异常,什么都没有。似乎该方法没有返回任何内容,并且阻止了其他内容。 为了尝试弄清楚问题是否真的是查询造成的,我编写了一个只连接到数据库的最小程序,并在不使用ORM系统的情况下执行查询。有趣的是,我可以复制这种行为

以下代码中的查询与我发现的导致问题的命名查询大致相同:

PreparedStatement statement1 = connection.prepareStatement("SELECT ID, COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D, COLUMN_E, COLUMN_F FROM TABLE_A WHERE ((COLUMN_F = ?) AND ((COLUMN_A = ?) AND (COLUMN_E = ?))) ORDER BY COLUMN_C");
statement1.setInt(1, 2389);
statement1.setDate(2, new Date(1432001201233L));
statement1.setDate(3, new Date(1432052300513L));
System.out.println("Getting result set");
ResultSet resultSet1 = statement1.executeQuery();
System.out.println("...got it"); // Never reached
这个查询已经使用了几个月,一直有效,直到上周

我发现,如果我删除查询中的括号,那么在我的香草测试应用程序中以及在JPA/EclipseLink中使用命名查询时,一切都会按照预期工作:

"SELECT ID, COLUMN_A, COLUMN_B, COLUMN_C, COLUMN_D, COLUMN_E, COLUMN_F FROM TABLE_A WHERE COLUMN_F = ? AND COLUMN_A = ? AND COLUMN_E = ? ORDER BY COLUMN_C"
在我看来,第一个查询中的括号虽然没有真正阐明查询的语义,但却是有效的SQL,不应该导致任何错误。 在SQL Developer中执行查询会产生预期的行为,即匹配条件的元组列表(如果存在)


所以我的问题是:我错过了什么?为什么查询工作了,然后突然停止了?为什么它不会导致任何异常、错误或类似的情况,而只是暂停了应用程序的执行?

登录到数据库服务器,查看top或process monitor并检查cpu使用情况,以查看数据库是否真正在做什么。您还可以检查v$sql\u计划以检查执行计划。我认为问题会在其他地方——删除额外的括号是一个微不足道的代数转换,Oracle对此没有问题。也许您的问题与数据有关。仅对绑定变量的特定值执行需要很长时间。如果它与数据相关或DB服务器的负载有问题,则在使用SQLDeveloper时也无法工作,还是我错了?您确定在这两种情况下对绑定变量使用相同的值吗?那么您确实需要一些工具来显示运行Oracle会话浏览器的执行计划。我认为即使是SQLDeveloper也可以做到这一点。