

### 背景

ある業務システムでは以下の３台のサーバーで運用されています。

  * APサーバー (Java Servlet)
  * DBサーバーA (Oracle)
  * DBサーバーB (Oracle)

APサーバー、DBサーバーAは、Webアプリのパッケージソフトの仕組みであり密接に関連づいています。（24時間常に稼働しています。）

今回とある業務要件で、Webアプリソフトの処理結果を、DBサーバーBに反映させる機能をパッケージソフトに追加しており、顧客のセキュリティポリシーより、DBサーバーA内にDBサーバーBへのDBLINKを作成し、Java
Servletにて、JDBCにより以下のようにDBLINKでDBサーバーBへ情報反映をしています。

[code]

    INSERT XXX FROM YYY@{DBLINKENAME}
    
[/code]

また、反映タイミングは一定時刻で起動されるバッチ処理となっています。  
(なお、DBサーバーAへのコネクションはstaticとし、１度取得したconnectionはずっと使いまわしています）

### 起きている問題

基本的に上記で問題なく稼働しています。  
しかし、DBサーバーBのメンテナンスで隔週で再起動を行っているのですが、  
再起動後に実行する「Webアプリソフトの処理結果を、DBサーバーBに反映させる機能」でORA-03150のエラーが発生することが時々あります。

[code]

    ORA-03150: end-of-file on communication channel for database link
    
[/code]

ポイントは、

  * ORA-03150のエラーは、必ずDBサーバBの再起動を行った日にだけ起こる。
  * １回目だけエラーになり、再度実行すると正常に反映できることや、  
１回目、２回目とエラーになり、３回目以降で正常に反映できること、  
１回目から問題なく成功すうることもあり等、現象が安定しない。

### 質問したいこと

**質問１**  
上記問題の原因は何だと推察できるでしょうか。

**質問２**  
DBサーバーAへのコネクションはstaticとし、１度取得したconnectionはずっと使いまわしていることが原因として考えられる点とは思いますが、あくまで今回はDBサーバーBしか再起動を行っておらず、DBサーバAへのコネクションを保持することに影響はないと考えています。  
JDBCのDBサーバーAへのconnectionインスタンスは、DBLINKのDBサーバーBへの接続コネクションも含まれているのでしょうか。

※これまでは、@{DBKLINKNAME}をSQLに含めることでクエリ発行時にDBLINKの接続にいっていると理解していましたが、この理解は誤っているでしょうか。

お知恵をお貸しください。  
よろしくお願いします。


CC BY-SA 4.0
2021-10-14T05:05:21.363
83090
2021-10-14T05:31:27.830
2021-10-14T05:31:27.830
3060
48642
question
java oracle jdbc
java.sql.ConnectionでDBLINK操作をしようとすると発生するORA-03150の原因を知りたい