前提
C#で開発したWindowsFormApplicationから、NLBを経由してRDS(Oracle)に接続しています。
データベースにアクセスした後に6分ほど放置し、DBのデータを取得・書込しようとすると、NLBのタイムアウトにより以下のエラーが出ます。
ORA-03135: 接続が失われました ---> OracleInternal.Network.NetworkException (0x80004005): ORA-03135: 接続が失われました ---> System.Net.Sockets.SocketException (0x80004005): 既存の接続はリモート ホストに強制的に切断されました。
KeepAliveの設定をすれば良いと思い、↓のサイトなどを参考に変更を行いました。
https://docs.oracle.com/cd/E15817_01/network.111/e05726/tnsnames.htm
「接続文字列内のDESCRIPTIONパラメータの下に(ENABLE=BROKEN)を埋め込むことにより、サポートされているTCP転送でのキープアライブ機能をネット・サービス・クライアントに対して有効にできます。」
- プログラムの修正
//接続文字列に(ENABLE=broken)を追加 var csb = new OracleConnectionStringBuilder() { UserID = hogehoge, Password = piyopiyo, DataSource = "(DESCRIPTION=**(ENABLE=broken)**(ADDRESS=(PROTOCOL=tcp)(HOST=xxxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=hogepiyo)))" , Pooling = true };
- クライアントのレジストリにKeepAliveの設定を追加
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
KeepAliveTime 0x000186a0(100000)
KeepAliveInterval 0x000186a0(100000)
動かしてパケットを監視してみたのですが、KeepAliveパケットが投げられていません。
実現したいこと
NLBのタイムアウトが起きないようにしたいです。
DataSourceの書き方が間違っていたり、足りない設定などがあれば教えていただけないでしょうか。
試したこと
クライアントにインストールされたsqlplusから、(ENABLE=broken)を追加したtnsnames.oraの情報を使用して接続するとKeepAliveパケットが投げられていることは確認できています。
補足情報(FW/ツールのバージョンなど)
VisualStudio2017
.NetFramework4.7.1
Oracle.ManagedDataAccess(4.122.18.3)

回答1件
あなたの回答
tips
プレビュー