如何在 SQL Anywhere 16 中限制查询运行时间
How to limit query runtime in SQL Anywhere 16
上周,我很高兴地跟踪了一个占用所有数据库资源的查询。我想要一种再次主动防止此类问题的方法。有没有一种方法可以自动防止查询花费超过 2 分钟到 运行(比如说),如果它太慢则在服务器上将其杀死?
有一些方法可以在查询速度慢时断开连接,但它们仍然会在服务器上留下查询 运行ning。我相信资源调控器将是我所需要的,但我没有发现 运行时间或内存限制,只有游标和语句。
我们正在 运行 宁 SQL 任何地方 16 并通过 Tomcat 连接池与 sajdbc4.jar 连接。
据我所知,查询超时必须由客户端设置,不能在数据库上强制执行。幸运的是,Tomcat 7 JDBC连接池提供了一个QueryTimeoutInterceptor,我现在已经实现了。它需要在连接池定义中的 server.xml 中增加一行:
jdbcInterceptors="QueryTimeoutInterceptor(queryTimeout=90);SlowQueryReport(threshhold=60000)"
这里的关键部分是QueryTimeoutInterceptor
。如果我们有开始 运行 长的查询,SlowQueryReport
会警告我。还有一种将它们公开为 JMX bean 的简单方法,我没有这样做。
上周,我很高兴地跟踪了一个占用所有数据库资源的查询。我想要一种再次主动防止此类问题的方法。有没有一种方法可以自动防止查询花费超过 2 分钟到 运行(比如说),如果它太慢则在服务器上将其杀死?
有一些方法可以在查询速度慢时断开连接,但它们仍然会在服务器上留下查询 运行ning。我相信资源调控器将是我所需要的,但我没有发现 运行时间或内存限制,只有游标和语句。
我们正在 运行 宁 SQL 任何地方 16 并通过 Tomcat 连接池与 sajdbc4.jar 连接。
据我所知,查询超时必须由客户端设置,不能在数据库上强制执行。幸运的是,Tomcat 7 JDBC连接池提供了一个QueryTimeoutInterceptor,我现在已经实现了。它需要在连接池定义中的 server.xml 中增加一行:
jdbcInterceptors="QueryTimeoutInterceptor(queryTimeout=90);SlowQueryReport(threshhold=60000)"
这里的关键部分是QueryTimeoutInterceptor
。如果我们有开始 运行 长的查询,SlowQueryReport
会警告我。还有一种将它们公开为 JMX bean 的简单方法,我没有这样做。