IBM DB2 9.1バージョンに対してクエリを再実行しようとすると、次のエラーメッセージが表示され続けます。
CLI0108E通信リンク障害。SQLSTATE = 40003
クエリは、レコードの大規模なセット(50000レコードを超える)を更新しています。
クエリ実行のタイムアウトを「0」に変更してみました
しかし、それは役に立ちませんでした。
また、db2cli.iniファイルにはタイムアウトの詳細がありません。そこに何か追加する必要がありますか?
お知らせ下さい。
IBM DB2 9.1バージョンに対してクエリを再実行しようとすると、次のエラーメッセージが表示され続けます。
CLI0108E通信リンク障害。SQLSTATE = 40003
クエリは、レコードの大規模なセット(50000レコードを超える)を更新しています。
クエリ実行のタイムアウトを「0」に変更してみました
しかし、それは役に立ちませんでした。
また、db2cli.iniファイルにはタイムアウトの詳細がありません。そこに何か追加する必要がありますか?
お知らせ下さい。
CLI0108Eは、単に接続が切断されたことを意味します。このエラーコードの公式IBM資料から:
CLI0108E通信リンク障害。
説明この関数の実行中に、ドライバとデータソース間の接続に失敗しました。
ユーザーの処置新しい接続を確立してください。
SQLState(40003)は、ステートメントが正常に完了したかどうかをDBサーバーが判断できないことを示しています。(SQLStateメッセージとその意味の文書はここにあります:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic =%2Fcom.ibm.db2.udb.msg.doc % 2Fdoc%2Fr0sttmsg.htm
この範囲の値:
- 40001自動ロールバックによるデッドロックまたはタイムアウトが発生しました。
- 40003ステートメントの完了は不明です。
- 40504システムエラーにより、作業単位がロールバックされました。
- 40506 SQLエラーのため、現在のトランザクションがロールバックされました。
- 40507インデックスの作成に失敗したため、現在のトランザクションがロールバックされました。
CLI0108Eには、さまざまな原因が考えられます。ネットワークの問題、タイムアウトが原因でクライアントまたはサーバーが接続を閉じる、誰かがコンピューター室でケーブルを蹴る、という名前を付けます。特定のVMホストで実行されている仮想サーバーで、仮想NICカードに問題があったためにこのエラーが発生し、ドライバーを再インストールすることで修正された環境もあります。考えられる原因のリストは驚くほど多いですが、優れたネットワーク管理者が支援できるはずです。(スニファを使用してパケットを監視することは、他のすべてが失敗したときに送信元を追跡するための良い方法です。)
可能であれば、コードをリファクタリングして小さなセットをアップロードしても問題はないかもしれません。10,000件のレコードがあるとします。一度に1,000件をアップロードしてみて、それが役立つかどうかを確認します。
サーバーが完全に信頼できない状況で私が(一度)使用した別のアプローチは、一度に1つのレコードを挿入しようとすることでした。
擬似コード:(「connection」という名前の接続オブジェクトと、その接続を使用する「cmd」という名前のコマンドオブジェクトを想定しています...)
connection.Open()
for each record
try
cmd.CommandText ="whatever changes need to be made"
cmd.Execute()
catch(Exception ex)
if( the exception is a communication link failure)
connection.Open()
cmd.Execute()
else
handle different errors accordingly
end if
end try
next
しかし、そのアプローチにはパフォーマンスの問題があり、厄介であり、接続を再開する試みが失敗する可能性があります。ピンチで使ったのですが、長期的にはお勧めしません。(元の問題が修正されたら、そのアプローチを取り除きました。)接続が切断された根本的な原因を突き止めようとする方がはるかに優れています。
あなたの場合、根本的な原因は、一度に大量のデータをアップロードしようとしていることである可能性があります。私はそれを疑うが、それは可能である。データを小さなチャンクで送信するようにコードをリファクタリングすることは、間違いなく私の最初の選択でした。
私を正しい方向に向けてくれたDavidに感謝します。私の場合、それはメモリリークでした。私は以下のようなコードを持っていました
IDbConnection conn = db2Access.GetConnection()
IDbCommand cmd = conn.CreateCommand()
に変更しました
using(IDbConnection conn = db2Access.GetConnection())
{
using(IDbCommand cmd = conn.CreateCommand())
{
......
}
}