В принципе, есть два способа добиться того, что вам нужно, в зависимости от того, имеете ли вы контроль над приложением или базой данных.
С конца приложения можно использовать SQL_ATTR_QUERY_TIMEOUT
ключевое слово с CLI / ODB C или setQueryTimeout
с JDB C (должен быть эквивалент для других интерфейсов). В конце я приложу пример CLI.
Если у вас есть только контроль над базой данных, можно рассмотреть возможность создания порога с ACTIVITYTOTALTIME
, который бы автоматически прерывал длительные запросы.
Если вы заинтересованы в клиенте Db2 CLP, то прерывание выполнения с помощью ctrl+c
будет распространять прерывание на базу данных, т.е. вы больше не должны видеть оператор как выполняющийся внутри базы данных. Однако, если вы «сломаете» его более «принудительно», например, запустите kill
против db2bp
процесса, связанного с оболочкой, оператор продолжит выполняться в течение некоторого времени, но в конечном итоге он будет прерван (один из них увидит AgentBreathingPoint
Warning в db2diag.log , когда механизм Db2 периодически проверяет, находится ли клиент все еще, и происходит ли его исчезновение).
Пример CLI Db2:
Я буду использовать
db2cli
исполняемый файл - CLI для запуска команд консоли Db2
«неверный запрос», который, как ожидается, будет выполняться в течение длительного времени:
select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only
- установить тайм-аут на 10 секунд
код:
SQLAllocEnv 1
SQLAllocConnect 1 1
SQLConnect 1 SAMPLE sql_nts db2v115 sql_nts **** sql_nts
SQLAllocStmt 1 1
SQLSetStmtAttr 1 SQL_ATTR_QUERY_TIMEOUT 10
SQLPrepare 1 "select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only" sql_nts
SQLExecute 1
SQLFetch 1
SQLError 1 1 1
сбой SQLFetch 1
, полный вывод, включая SQLCODE ниже:
$ db2cli
IBM DATABASE 2 Interactive CLI Sample Program
(C) COPYRIGHT International Business Machines Corp. 1993,1996
All Rights Reserved
Licensed Materials - Property of IBM
US Government Users Restricted Rights - Use, duplication or
disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
> SQLAllocEnv 1
SQLAllocConnect 1 1
SQLConnect 1 SAMPLE sql_nts db2v115 sql_nts *** sql_nts
SQLAllocStmt 1 1
SQLSetStmtAttr 1 SQL_ATTR_QUERY_TIMEOUT 10
SQLAllocEnv: rc = 0 (SQL_SUCCESS)
CLI henv = 1, Test Driver henv = 1
> SQLAllocConnect: rc = 0 (SQL_SUCCESS)
CLI hdbc = 1, Test Driver hdbc = 1
> SQLConnect: rc = 0 (SQL_SUCCESS)
> SQLAllocStmt: rc = 0 (SQL_SUCCESS)
CLI hstmt = 1, Test Driver hstmt = 1
> SQLSetStmtAttr: rc = 0 (SQL_SUCCESS)
> SQLPrepare 1 "select t1.*, t2.* from sysibm.syscolumns t1, sysibm.syscolumns t2, sysibm.syscolumns t3, sysibm.syscolumns t4, sysibm.syscolumns t5 order by t5.name desc, t4.name asc fetch first 10 rows only" sql_nts
SQLPrepare: rc = 0 (SQL_SUCCESS)
> SQLExecute 1
SQLExecute: rc = 0 (SQL_SUCCESS)
> SQLFetch 1
SQLFetch: rc = -1 (SQL_ERROR)
> SQLError 1 1 1
SQLError: rc = 0 (SQL_SUCCESS)
SQLError: SQLState : S1008
fNativeError : -952
szErrorMsg : [IBM][CLI Driver][DB2/6000] SQL0952N Processing was cancelled due to an interrupt. SQLSTATE=57014
cbErrorMsg : 100