自動再接続機能とは、データベースサーバのダウンおよび通信回線の異常発生時に、無効となったプーリングされたコネクションを破棄したあとに、再度接続することで、データベースサーバ復旧後に、継続してデータベースアクセスを可能とする機能です。
自動再接続機能を使用することで、IJServerを再起動することなく、自動的にデータベースとの再接続を確立します。
自動再接続機能を利用すると有効な例
以下のようなシステムで運用している場合を例にして、説明します。
使用しているデータベースは、Oracle Real Application Clusters(以降、Oracle RAC)である
Oracle RACは、「現行サーバ」と「待機サーバ」に役割を分担させている
正常時は「現行サーバ」にのみ接続する運用方法である
アプリケーションサーバ(以降、IJServer)は、データベース接続したコネクションをプーリングし、以降のgetConnection呼び出し時にプーリングされたコネクションを返却しています。
正常時に接続する「現行サーバ」に異常が発生した場合、「待機サーバ」への切り替えが自動的に行われます。その際、IJServerでプーリングしていたコネクションは「現行サーバ」がダウンした時点で無効となるため、「待機サーバ」への切り替え後にアプリケーションからのデータベースアクセス時にエラーとなり、アプリケーションの運用ができなくなります。
そのため、IJServer側で自動的に無効となった、コネクションプール上のコネクションを開放するようなシステムに変更します。
自動再接続を使用する場合
IJServerは、以下の処理を行うことによりデータベースサーバがダウンした時のリカバリ(再接続)を行います。
IJServerは、アプリケーションよりgetConnection呼び出しが来た場合、プールから取得したコネクションに対してSQL(注)文を発行し、接続確認を行います。
正常終了した場合は、取得したオブジェクトは有効なものであると判断して返却します。
例外が発生した場合は、プールから取得したコネクションを破棄してデータベースに直接getConnection呼び出しを行います。
SQL(注)文の発行で例外が発生した場合、またはアプリケーションからのgetConnection呼び出し時にプールがなく、直接データベースにgetConnection呼び出しをして例外が返却された場合、接続が正常に終了するまで指定された回数分、一定間隔でデータベース接続処理を繰り返します。
接続が正常に終了した時点で、アプリケーションへ接続したコネクションを返却します。
指定された回数実行しても接続に失敗する場合は、SQLExceptionを返却します。
SQL:Oracleが推奨している、以下のSQL文を発行します。
select sysdate from dual |
本章の例では、データベースにOracleを使用しているため発行されるSQL文は“select sysdate from dual”になりますが、Symfoware、PostgreSQL、SQL Serverを使用する場合は、以下が発行されます。Symfowareの場合には、以下のSQL文は構文エラーとなりますが、エラー発生時のエラーコードでデータベースに正常に接続できたか確認しています。
select 1 |
再接続のタイミング
DBMS異常が発生した場合のDBMSへの再接続は、プールからコネクションを取得した時、またはプールにコネクションがない場合にDBMSから直接コネクションを取得した時に行います(DBMSへの接続を確認した時点で、トランザクションが開始し、SQL発行が可能な状態となります)。
トランザクション中、およびコネクションを取得した後にDBMSがダウンした場合、そのトランザクション内でDBアクセス、またはEntity Bean(CMP)にアクセス(SQL発行)を行うと、例外が発生します(この際、DBMSへの再接続は行われません)。
この場合、JDBCコネクションをクローズしてトランザクションをロールバックしてから、再度処理を継続してください(トランザクション管理種別がContainerの場合は、コンテナがロールバックを行います)。
以下に、Entity Bean(CMP)で無効なコネクションを使用した場合に発生する例外を示します。
メソッド | 返却される例外 |
---|---|
create | java.rmi.RemoteException |
findByPrimaryKey | |
find<METHOD> | |
remove | |
find<METHOD>の返却値Enumerationに対するnextElementメソッド | java.lang.RuntimeException |
find<METHOD>の返却値CollectionのIteratorに対するnextメソッド |
以下に、トランザクション完了時に発生する例外を示します。
メソッド | 返却される例外 |
---|---|
commit | javax.transaction.HeuristicMixedException |
rollback | - |
JDBCコネクションの自動再接続機能の設定について詳細は、“27.2 IJServerのチューニング”を参照してください。
Oracle RACと連携する場合は、付録B Oracle Real Application Clustersとの連携を参照してください。