簡體   English   中英

如果超過DB2中分配的時間,則終止SQL查詢執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM