如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?
Posted
技术标签:
【中文标题】如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?【英文标题】:How can I enforce a query timeout for MS SQL Server queries run via the MS JDBC Driver? 【发布时间】:2016-04-11 16:08:03 【问题描述】:我们如何让 MS JDBC 驱动程序在 n 秒后抛出超时错误?
背景
我们有一个应用程序默认使用 Microsoft JDBC 驱动程序(4.0 版)来查询 SQL Server 2014。
大多数情况下,查询需要 10-20 秒才能完成。但是,有时查询需要超过 5 分钟才能完成。
我们希望应用程序将耗时超过 5 分钟的查询视为错误。目前该应用程序没有提供超时设置,因此我们仍在研究 MS JDBC 驱动程序的超时设置,但我找不到任何东西可以将长时间运行的查询标记为超时错误。
我已经找到了 jTDS 驱动程序的超时设置 (socketTimeout)。
MS 驱动程序是否有等效的“socketTimeout”或“queryTimeout”?我已经尝试了以下所有方法,但它们都不适用于 MS 驱动程序:
#None of these enforce a timeout with the MS Driver
jdbc:sqlserver://hostname\instanceName;databaseName=mydb;queryTimeout=10
jdbc:sqlserver://hostname\instanceName;databaseName=mydb;socketTimeout=10
jdbc:sqlserver://hostname\instanceName;databaseName=mydb;queryTimeout=10
#This works great with the jTDS driver:
jdbc:sqlserver://hostname\instanceName;databaseName=mydb;socketTimeout=10
【问题讨论】:
此处记录了所有有效的连接属性:msdn.microsoft.com/en-us/library/ms378988.aspx 与查询超时没有任何相似之处。您需要在每个Statement
上手动设置:docs.oracle.com/javase/8/docs/api/java/sql/…
@a_horse_with_no_name - 这些方法在 java 代码级别下降......而且我无权访问 java 代码(因为这是购买的应用程序)。我想我可以向供应商提交增强请求,以便在 GUI 中给我们一个设置,将超时值传递给 Statement
setQueryTimeout(int seconds)
方法。 (或者我想我可以切换驱动程序?)
有没有办法用连接钩子设置超时?
没关系,我看不到任何可通过SET
语句获得的超时设置:msdn.microsoft.com/en-us/library/ms190356.aspx
【参考方案1】:
Microsoft MSSQL-JDBC 现在是开源的。最近 MSSQL-JDBC 团队实现了sockettimeout & querytimeouts。这肯定会解决你的问题。
有连接查询:
String conURL = "jdbc:sqlserver://localhost;userName=sa;password=PASSW0RD;database=master;queryTimeout=5";
SQLServerConnection con = (SQLServerStatement) DriverManager.getConnection(conURL);
或使用数据源....
SQLServerDataSource ds = new SQLServerDataSource();
ds.setUser("sa");
ds.setPassword("PASSWORD");
ds.setServerName("localhost");
ds.setPortNumber(1433);
ds.setDatabaseName("master");
ds.setQueryTimeout(5);
SQLServerConnection con = (SQLServerConnection) ds.getConnection();
参考:https://github.com/Microsoft/mssql-jdbc/wiki/QueryTimeout
【讨论】:
这实际上会终止数据库中运行的查询,还是只是释放应用程序中的连接并让查询继续运行?以上是关于如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Azure 数据砖中使用 ucanaccess(ms 访问 jdbc 驱动程序)?
Window 2008 Tomcat 7 MS SQL Server 2008R2 - 无法识别JNDI JDBC驱动程序
通过 ms jdbc 连接到 Azure SQL DB 的 Android 应用程序错误