Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.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/8/mysql/56.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 JDBC QueryTimeout仅适用于某些供应商_Java_Mysql_Sql Server_Oracle_Jdbc - Fatal编程技术网

Java JDBC QueryTimeout仅适用于某些供应商

Java JDBC QueryTimeout仅适用于某些供应商,java,mysql,sql-server,oracle,jdbc,Java,Mysql,Sql Server,Oracle,Jdbc,我试图使用JDBC将查询超时添加到我的系统中。我正在使用statement.setQueryTimeout函数来执行此操作。我知道这个值是在我使用connection.createStatement、prepareStatement等创建的语句上设置的,因为我已经使用statement.getQueryTimeout检查了它。但是,当使用不同的数据库(mysql、mssql、oracle和db2)进行测试时,只有mysql能够正常工作,而其他所有数据库实际上都不会超时 你知道这是什么原因吗?我不

我试图使用JDBC将查询超时添加到我的系统中。我正在使用statement.setQueryTimeout函数来执行此操作。我知道这个值是在我使用connection.createStatement、prepareStatement等创建的语句上设置的,因为我已经使用statement.getQueryTimeout检查了它。但是,当使用不同的数据库(mysql、mssql、oracle和db2)进行测试时,只有mysql能够正常工作,而其他所有数据库实际上都不会超时


你知道这是什么原因吗?我不确定为什么一个设置的工作级别很高,而其他设置的工作级别不高,因为我使用的是标准提供的驱动程序

很可能这些驱动程序还没有实现它(还?)。有些数据库服务器无法定义查询超时。某些数据库服务器可能支持查询取消,但这要求驱动程序本身跟踪查询取消,并异步向服务器发送取消,这可能在服务器上得到及时处理,也可能得不到及时处理(例如,由于连接线程当前正在处理查询,因此在查询完成之前,数据库服务器无法处理该取消)

理论上,客户端可以“放弃”查询,但这通常意味着连接本身变得不可用,因为连接的服务器端仍在工作(或者服务器返回的响应未被处理)


长话短说:这是一个困难的问题,并非所有数据库都有足够的支持来支持此JDBC功能。

VedorId查询的问题与VedorId冲突,返回超时错误,因为它在该时间段内没有得到任何结果检查您使用的Oracle JDBC驱动程序的版本。对于Oracle,可以在至少在协议级别。在使用OCI时,无论主线程如何处理连接,都可以从任何线程使用OCIBreak。OCIBreak将发送OOB(带外)数据包到服务器以取消查询执行。通常,您需要等待一段时间,直到OCI功能也在JDBC中插入。在这种情况下,问题是JVM本身不支持OOB TCP功能。感谢您提供的信息,我一定会对此进行研究;OCIBreak可能是一项足够好的工作around@MaddenOCIBreak是来自OCI(C)的函数PS:JDBC驱动程序中也有方法“Cancel()”。这个方法应该与OCIBreak相同,并且是线程安全的。但是,您可以使用名为ojdbc7.jar(不是ojdbc6.jar)的驱动程序。请参阅主题的文档:我刚刚检查了文档中的语句。Cancel()Oracle JDBC驱动程序版本10g和11g中的实现。10g版本中还有一句话“
在某些情况下,服务器挂起,但JDBC不会收到IOException。语句。取消()不会释放启动该语句的线程。执行()。由于Java线程API的限制,没有可接受的解决方法。
“.在11g中,这句话被删除了。那么他们找到了解决方法了吗?或者他们只是购买了Java,因此就删除了这个投诉?当然,我是说我使用的数据库都说它们支持JDBC::setQueryTimeout作为标准。我认为您提到的线程问题值得研究;不过,我之前做过的研究已经证明了这一点显示了MySQL实现创建了一个超时线程,该线程有自己的连接并处理关闭查询本身,而其他供应商创建了一个线程,只向父级发送消息,然后父级必须处理it@Madden取消来自不同连接的请求是一种有趣的方法对于许多数据库服务器来说,“语句标识”的复杂性连接是本地的,而不是服务器全局的,更不用说每个连接需要两个连接的开销,或者共享“取消”连接的协调。这意味着我知道,例如Oracle很难取消语句,即使您使用可用的管理功能来执行所述取消;)