OCI(Oracle Clud Infrastructure)のDBCS(Database Cloud Service)などのデータベースを利用する際に、通信経路の何らかの機器のタイムアウト設定などの影響を受けて、接続がORA-3113でタイムアウトすることがあります。(クラウド環境に限らない話ですが....)
対応方法としては、該当機器のタイムアウト設定を見直す方法がありますが、Oracle Client側の設定で対処できるか確認してみました。
1.Windows10のTCP/IP Keep Alive Time変更
まずは、Oracle ClientとなるWindows10のKeep Alive Timeを設定してみます。
マイクロソフト社のTechNetにある「TCP 関連でレジストリにより設定可能なパラメーターについて」の記事を参考にしました。
TCP/IPのKeep Alive Timeとして、以下のレジストリーキーを追加します。
パス:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
名前:KeepAliveTime
種類:REG_DWORD(32ビット)
値:設定したいKeep Alive Time(ミリ秒)
2.tnsnames.oraの変更
Oracle Net ServiceのEnableパラメータをOracle Clientのtnsnames.oraに設定することで、TCP転送のキープアライブ機能をネット・サービス・クライアントに対して有効にできます。
tnsnames.oraのDESCRIPTIONセクションに「(ENABLE=BROKEN)」を追加します。
privatedb =
(DESCRIPTION =
(ENABLE=BROKEN)
(ADDRESS = (PROTOCOL = TCP)(HOST = xxx.xxx.xxx.xxx)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = xxxxxxxx.subxxxxxxxx.vcnxxxxxxxx.oraclevcn.com)
)
)
こちらの記事にある、ネットワーク・ロード・バランサを経由したデータース接続環境でテストしたところ、本来6分でタイムアウトする事象を回避できることを確認できました。