如何对通过 MS JDBC 驱动程序运行的 MS SQL Server 查询强制执行查询超时?

Col*_*hie 6 sql-server jdbc

我们怎样才能让 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
Run Code Online (Sandbox Code Playgroud)

Nik*_*hil 4

Microsoft MSSQL-JDBC 现已开源。最近,MSSQL-JDBC 团队实现了sockettimeoutquerytimeout。这绝对能解决你的问题。

使用连接查询:

String conURL = "jdbc:sqlserver://localhost;userName=sa;password=PASSW0RD;database=master;queryTimeout=5";
SQLServerConnection con = (SQLServerStatement) DriverManager.getConnection(conURL);
Run Code Online (Sandbox Code Playgroud)

或使用数据源....

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();
Run Code Online (Sandbox Code Playgroud)

参考:https: //github.com/Microsoft/mssql-jdbc/wiki/QueryTimeout

  • 这实际上会终止数据库中运行的查询,还是只是释放应用程序中的连接并保持查询运行? (4认同)