VPN経由でOracle DBに接続できない/クエリがすごく遅い
Oracle社のパッケージを利用したSI案件では、ライセンスの関係上、オフショアサイト側にOracleデータベースとパッケージ(Oracle EBSとか)を配置できないケースが多い(高いから)。そんな時は、日本側のオフィス(またはクライアントのDC)とオフショア側のオフィス間で拠点間VPNを張り、オフショア側から接続させる。
で、大体どのプロジェクトでも、オフショア側から「Oracleにつながらない」「検索が重くて結果が返ってこない。開発にならない」「PL/SQLのコンパイルができない」などとクレームを受けることになる。ネットワーク系の問題だと大体わたしのところにお鉢が回ってくるので、少し切り分けをしてみた。
結論から言うと、Oracle 11g Clientになってからクライアントの仕様が変わったことで、問題が起きるようだ。
10gの場合、SDU(セッションデータユニット)のデフォルトは2048
http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/network.102/B19208-02/performance.htm
11gの場合、SDUのデフォルトは8192
http://download.oracle.com/docs/cd/E16338_01/network.112/b56288/performance.htm
SDUとは
http://docs.oracle.com/cd/E16338_01/network.112/b56288/performance.htm#i1006332
11gになってSDUのサイズが大きくなったため、10gまでのクライアントでは問題なかったのに、11gクライアントからはVPN通信中にパケットロス等の問題が起きるようになった模様。
オフショア側のクライアント側で、SDUのサイズを小さくする(2048とか)ことで、問題は解決した。
SDUのサイズはクライアント側のsqlnet.oraファイルや、tnsnames.oraファイルの設定で調整できる。
なお、オフショア側でSQL Developerを使っている場合は、先ずOracle Clientをオフショア側の端末にインストールすること。そして、クライアント側のtnsnames.oraファイルでSDUのサイズを指定し、以下のサイトを参考に、SQL Developerでtnsnames.oraファイルの場所を指定する。