Oracle DBへ接続しようとした際に
ORA-03135: connection lost contact(接続が失われました)
というエラーが発生することがあります。
特にバッチ処理中や、長時間実行するSQL、アプリケーション側からの接続で発生しやすく、
原因がネットワークにあるのか、DBにあるのか判断が難しいエラーです。
本記事では 主な原因と効果的な対策 をわかりやすく整理します。
ORA-03135 エラーメッセージ
意訳すると
DBサーバとの通信が途中で切れた/接続が維持できなかった
発生する主な原因
1. ネットワークのタイムアウト
-
ルーター・FW・LB・SSLインスペクション装置などのタイムアウト設定
-
長時間応答が無いと通信を切断される
2. SQLの実行時間が長すぎる
-
大量データ更新や複雑な検索で応答が止まる
-
通信が無いとみなされ切断
3. DBサーバ側のパラメータ設定
-
SQLNET.EXPIRE_TIMEが未設定 -
DB server process timeout
4. Oracle Net の再送制御
-
TCP KeepAliveが有効でない
-
OSレベルのソケット維持設定不足
5. ネットワーク回線やVPNの不安定
-
Wi-FiやVPN経由の接続で発生しやすい
実務で効果が高い対処方法
① SQLNET.EXPIRE_TIME を設定する(DB側)
Oracle Netの定期送信で接続維持を行う
$ORACLE_HOME/network/admin/sqlnet.ora に以下を追加/変更:
10は 10分間隔で keepalive パケットを送信
※DB再起動が必要
② FireWall / LoadBalancer / Proxy のタイムアウト調整
以下の値を確認し、短すぎる場合は延長する
| 項目 | 推奨例 |
|---|---|
| TCP Session Timeout | 900秒〜1800秒 |
| HTTPS Idle Timeout | 300秒以上 |
| SSL Inspection Timeout | 900秒以上 |
| Connect Timeout | 120〜300秒 |
長時間SQLが想定される業務(データ移行、帳票処理など)の場合は特に重要です。
③ アプリケーション側の接続タイムアウト設定
JDBCでの例(Java):
接続維持設定(HikariCP例):
|
1 2 |
idleTimeout=600000 maxLifetime=1800000 |
④ SQLのパフォーマンス改善
-
インデックス不足
-
不要なソート・関数使用
-
フルスキャンの見直し
-
バッチ更新の分割
SQLチューニングにより根本解決できるケースが最も多い
⑤ Wi-FiやVPN経由接続を避ける
ネットワーク経由が不安定な場合に顕著
VPN切断 → DB通信切断 → ORA-03135 という流れも多い
実務でのトラブル事例と解決例
| 状況 | 原因 | 対策 |
|---|---|---|
| バッチ実行時に毎回 20分前後で切断 | FWのIdle Timeoutが短い | Idle Timeoutを900秒へ変更 |
| 大量UPDATE実行中にエラー | SQL実行時間が長すぎ | 更新処理を分割/EXPIRE_TIME設定 |
| VPN接続でのみ発生 | ネットワーク切断 | 有線接続で安定化 |
エラー発生時の確認ポイントチェックリスト
-
切断タイミングは何分後か?
-
SQLは長時間実行しているか?
-
VPN/Wi-Fi利用?
-
firewall / proxy / LB の idle timeout 値は?
-
SQLNET.EXPIRE_TIMEの設定有無 -
アプリ側の接続設定は適切か?
まとめ
ORA-03135は「通信切断」が原因で発生するエラーであり、
ネットワーク側とDB側の両面から対策が必要です。
効果的な対処
-
SQLNET.EXPIRE_TIMEを設定 -
ネットワークタイムアウト値の延長
-
アプリケーションの接続設定
-
SQLパフォーマンス改善
特に 長時間SQL処理を行うバッチ処理ではほぼ必須の対策です。
