[英]Kill SQL query execution if it exceeds allotted time in DB2
我正在.NET中創建一個程序,該程序使用IBM DB2 .NET提供程序(IBM.Data.DB2)連接到DB2數據庫(v9.7)並運行選擇查詢。
如果提交的選擇查詢花費了5秒鍾以上的時間來返回數據,則程序應終止SQL執行。
為了按照IBM的文檔實現這一點,我可以在連接中使用QueryTimeout參數。
string connStr = "Server=server:12345;Database=db;UID=user;PWD=pass; QueryTimeout = 5;";
DB2Connection conn = null;
DB2Command cmd = null;
conn = new DB2Connection(connStr);
conn.Open();
Console.WriteLine("IBM DB2: " + conn.IsOpen);
if (conn.IsOpen)
{
Console.WriteLine(conn.ConnectionTimeout);
cmd = conn.CreateCommand();
cmd.CommandText = "select * from user.orders";
DB2DataReader reader = cmd.ExecuteReader();
int counter = 0;
while (reader.Read())
{
counter += 1;
Console.WriteLine(reader.GetDB2Int64(0));
}
reader.Close();
}
conn.Close();
當我在winSQL中運行查詢時,查詢花了大約20秒鍾執行。 但是當我在該程序中執行它時,我花了同樣的20秒。 根據文檔,查詢應在5秒鍾后終止。
為什么執行沒有停止?
PS:我也嘗試將cmd.CommandTimeout設置為5 ,但仍然不會停止執行。
閱讀IBM網站上的DB2Command.CommandTimeout
屬性教程。 我希望這能解決您的問題。 C#示例代碼如下:
[C#]
public void CreateMyDB2Command()
{
string mySelectQuery = "SELECT * FROM EMPLOYEE ORDER BY EMPNO";
DB2Command myCommand = new DB2Command(mySelectQuery);
myCommand.CommandTimeout = 20;
}
上面的示例的問題在於ExecuteReader()在數據庫中創建了一個游標,該游標在讀取數據時將數據拉入數據庫,因此查詢永遠不會超時。
但是使用DataAdapter到數據集,一次即可提取數據。 因此,以下內容似乎會殺死執行。
string connStr = "Server=server:12345;Database=db;UID=user;PWD=pass;";
conn = new DB2Connection(connStr);
conn.Open();
if (conn.IsOpen)
{
Console.WriteLine(conn.ConnectionTimeout);
cmd = conn.CreateCommand();
cmd.CommandText = "select * from orders";
cmd.CommandTimeout = 5;
DB2DataAdapter adp = new DB2DataAdapter(cmd);
DataSet ds = new DataSet();
adp.Fill(ds);
foreach (DataRow row in ds.Tables[0].Rows){
Console.WriteLine(row[0]);
}
}
conn.Close();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.