    001/*
    002 * Copyright (c) 2009 The openGion Project.
    003 *
    004 * Licensed under the Apache License, Version 2.0 (the "License");
    005 * you may not use this file except in compliance with the License.
    006 * You may obtain a copy of the License at
    007 *
    008 *     http://www.apache.org/licenses/LICENSE-2.0
    009 *
    010 * Unless required by applicable law or agreed to in writing, software
    011 * distributed under the License is distributed on an "AS IS" BASIS,
    012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
    013 * either express or implied. See the License for the specific language
    014 * governing permissions and limitations under the License.
    015 */
    016package org.opengion.fukurou.db;
    017
    018import org.opengion.fukurou.util.AbstractObjectPool;
    019import org.opengion.fukurou.util.ApplicationInfo;
    020import org.opengion.fukurou.util.Closer;
    021
    022import java.util.Map;
    023import java.util.HashMap;
    024import java.util.Locale;
    025import java.util.Properties;
    026import java.sql.Connection;
    027import java.sql.SQLException;
    028import java.sql.DriverManager;
    029import java.sql.DatabaseMetaData;
    030
    031/**
    032 * データベースのコネクションオブジェクトを取得する為に使用する，ファクトリクラスです。
    033 *
    034 * Connection.connection() メソッドで，Connectionオブジェクトを取得します。
    035 * Connection#close() メソッドで，内部的に ConnectionFactory にオブジェクトを戻す
    036 * 事によって,Connectionオブジェクトのプーリングを行なっています。
    037 *
    038 * コネクションオブジェクトは，プールから貸し出します。
    039 * つまり，貸し出し中には,プールには，オブジェクトは残っていません。
    040 * その状態で,コネクションオブジェクトをclose()しない場合は,オブジェクトが破棄されて,
    041 * 貸し出し中カウントと実際のオブジェクト数が食い違い,リソースが不足します。
    042 * 必ず,作成したオブジェクトは,close()メソッドを呼び出して,プールに返して下さい。
    043 *
    044 * システムリソースの USE_DB_APPLICATION_INFO=true の場合、コネクションにアプリケーション
    045 * 情報を追記するため、ApplicationInfoオブジェクトを使用します。
    046 * このオブジェクトは、jsp/common/session-init.jsp にてユーザー情報とアプリケーション
    047 * 情報を画面アクセスごとに設定します。
    048 *
    049 * @og.group ＤＢ/Shell制御
    050 * @og.rev 4.0.0.0 (2007/10/16) パッケージ移動(hayabusa/db ⇒ fukurou/db)
    051 *
    052 * @version  4.0
    053 * @author   Kazuhiko Hasegawa
    054 * @since    JDK5.0,
    055 */
    056public final class ConnectionFactory {
    057        private static final Map<String,ConnectionPool> map = new HashMap<String,ConnectionPool>();
    058
    059        // 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    060        // 4.0.0.0 (2007/10/29) 初期値をここでセットする
    061        private static  String  DBID = "DEFAULT";
    062        private static  ConnectionPool DEF_POOL ;
    063
    064        // 4.0.0.0 (2007/10/17) システム依存の改行記号をセットします。
    065        private static final String CR = System.getProperty( "line.separator" );
    066
    067        // 4.0.0.0 (2007/10/25) hayabusa依存を切るために追加します
    068        private static final int BUFFER_MIDDLE = 200;
    069
    070        private static DatabaseConfig  dbc;
    071
    072        /**
    073         *  デフォルトコンストラクターをprivateにして、
    074         *  オブジェクトの生成をさせないようにする。
    075         *
    076         */
    077        private ConnectionFactory() {
    078        }
    079
    080        /**
    081         * 初期化メソッドです。
    082         * <pre>
    083         * １)第二引数にXMLファイルをクラスローダ基底からの相対パスで指定した場合は
    084         * 　　そのXMLを利用してDBConfigオブジェクトを作成します。例：ConnectionFactory.init( CONTEXT_NAME, "../DBConfig.xml")
    085         * 　　nullの場合はWEB-INF/DBConfig.xmlを利用します。例：ConnectionFactory.init( CONTEXT_NAME, null)
    086         * ２)キャッシュ初期ConnectionPoolのキーを設定してキャッシュプールを作ります。
    087         * 　　この値がnullの場合は"DEFAULT"が設定されます。
    088         * </pre>
    089         *
    090         * <strong>このクラスを利用する場合は必ず最初にこのメソッドを実行する必要があります。</strong>
    091         * キャッシュとDBConfigオブジェクトの同期化はされていないので初期化以外での利用は避けて下さい。
    092         *
    093         * @og.rev 4.0.0.0 (2007/11/05) 新規作成
    094         *
    095         * @param defPoolKey  初期DBID名(nullの場合は、"DEFAULT")
    096         * @param xmlFileName DBConfig.xmlファイルのファイル名(nullの場合は、WEB-INF/DBConfig.xml)
    097         */
    098        public static void init( final String defPoolKey, final String xmlFileName ) {
    099                // DBConfigオブジェクトの作成
    100                if( xmlFileName == null || xmlFileName.length() == 0 ) {
    101                        dbc = new DatabaseConfig();
    102                }
    103                else {
    104                        dbc = new DatabaseConfig( xmlFileName );
    105                }
    106
    107                if( defPoolKey == null || defPoolKey.length() == 0 || dbc.getDbid( defPoolKey ) == null ) {
    108                        DBID = "DEFAULT";
    109                }
    110                else {
    111                        DBID = defPoolKey;
    112                }
    113                EDbid edbid = dbc.getDbid( DBID );
    114                if( edbid == null ) {
    115                        final String errMsg = "初期化時に、指定のDBIDキーが存在しません。"
    116                                + "[Key ="
    117                                + DBID
    118                                + "]";
    119                        throw new RuntimeException( errMsg );
    120                }
    121
    122                DEF_POOL = new ConnectionPool( edbid );
    123        }
    124
    125        /**
    126         * コネクションオブジェクトを取得します。
    127         * 遅い初期化を行なう事により,実際に必要となるまでコネクションオブジェクトは
    128         * 作成しません。
    129         * 最大プール数に達して,なおかつ,すべてのConnectionが貸し出し中の場合,
    130         *
    131         * @og.rev 2.1.1.3 (2002/11/22) コネクションID が null の場合に DEFAULT から所得するように変更。
    132         * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用している箇所で、非同期でも構わない箇所を、HashMap に置換え。
    133         * @og.rev 3.5.6.2 (2004/07/05) 文字列の連結にStringBuilderを使用します。
    134         * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを設定
    135         * @og.rev 3.8.8.2 (2007/01/26) USE_DB_APPLICATION_INFO ⇒ pool.useApplicationInfo() 変更
    136         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    137         * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大文字に変換する。
    138         *
    139         * @param   dbid 接続先ID
    140         * @param   appInfo アプリ情報オブジェクト
    141         *
    142         * @return  コネクションオブジェクト
    143         */
    144        public static Connection connection( final String dbid , final ApplicationInfo appInfo ) {
    145                ConnectionPool pool ;
    146                if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
    147                        pool = DEF_POOL ;
    148                }
    149                else {
    150                        String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
    151                        synchronized( map ) {
    152                                pool = map.get( udbid );
    153                                // 接続IDが、map に存在しない場合
    154                                if( pool == null ) {
    155                                        EDbid edbid = dbc.getDbid( udbid );
    156                                        if( edbid == null ) {
    157                                                final String errMsg = "指定のDBIDキーが存在しません。"
    158                                                        + "[Key ="
    159                                                        + udbid
    160                                                        + "]";
    161                                                throw new RuntimeException( errMsg );
    162                                        }
    163                                        pool = new ConnectionPool( edbid );
    164                                        map.put( udbid,pool );
    165                                }
    166                        }
    167                }
    168
    169                Connection conn = pool.newInstance();
    170
    171                // 3.8.7.0 (2006/12/15) アクセスログ取得の為,ApplicationInfoオブジェクトを使用
    172                // 3.8.8.2 (2007/01/26) ORACLE 以外は、使用しません。
    173                // 4.0.0.0 (2007/11/29) 入れ子if の統合
    174                if( appInfo != null && pool.useApplicationInfo() ) {
    175                        appInfo.callAppInfo( conn );
    176                }
    177                return conn;
    178        }
    179
    180        /**
    181         * コネクションオブジェクトをプールに戻します。
    182         * Connectionオブジェクトは,close()メソッドで,自分自身を ConnectionFactory の
    183         * プールに戻します。
    184         * それ以外の コネクションオブジェクトをプールに戻す場合は,このメソッドを使用します。
    185         *
    186         * @og.rev 2.1.1.3 (2002/11/22) コネクションID が null の場合に DEFAULT から所得するように変更。
    187         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    188         * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大文字に変換する。
    189         * @og.rev 5.9.32.0 (2018/05/18) プールに戻す前に明示的にcommitをかける
    190         *
    191         * @param   conn コネクションオブジェクト
    192         * @param   dbid 接続先ID
    193         */
    194        public static void close( final Connection conn,final String dbid ) {
    195                if( conn != null ) {
    196                        Closer.commit( conn ); // 5.9.32.0 (2018/05/18) プールに戻す前に明示的にcommitをかける
    197                        if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
    198                                DEF_POOL.release( conn ) ;
    199                        }
    200                        else {
    201                                String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
    202                                synchronized( map ) {
    203                                        ConnectionPool pool = map.get( udbid );
    204                                        if( pool != null ) {
    205                                                pool.release( conn );
    206                                        }
    207                                }
    208                        }
    209                }
    210        }
    211
    212        /**
    213         * コネクションオブジェクトを物理的に削除(クローズ)戻します。
    214         * これは、コネクション等がエラーを起こした場合に、プールに戻すのではなく、
    215         * 接続を閉じる場合に、使用されます。
    216         *
    217         * @og.rev 2.1.1.3 (2002/11/22) コネクションID が null の場合に DEFAULT から所得するように変更。
    218         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    219         * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大文字に変換する。
    220         *
    221         * @param   conn コネクションオブジェクト
    222         * @param   dbid 接続先ID
    223         */
    224        public static void remove( final Connection conn,final String dbid ) {
    225                if( conn != null ) {
    226                        if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
    227                                DEF_POOL.remove( conn ) ;
    228                        }
    229                        else {
    230                                String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
    231                                synchronized( map ) {
    232                                        ConnectionPool pool = map.get( udbid );
    233                                        if( pool != null ) {
    234                                                pool.remove( conn );
    235                //                              map.put( udbid,pool );
    236                                        }
    237                                }
    238                        }
    239                }
    240        }
    241
    242        /**
    243         * コネクションオブジェクトを実際にすべてクローズします。
    244         * コネクションプールの再編成や，管理者による強制クローズに使用します。
    245         *
    246         * クローズに失敗(コネクションが貸し出し中)の場合は,内部的に
    247         * DB_CLOSE_RETRY_TIME だけ待機して, DB_CLOSE_RETRY_COUNT 回数だけ,試行します。
    248         * それでもクローズできない場合は, RuntimeException を throw します。
    249         *
    250         * @og.rev 4.0.0.0 (2005/01/31) ロジック見直し。 pool.clear() で、基本的にはすべて削除されます。
    251         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    252         */
    253        public static void realClose() {
    254                synchronized( DEF_POOL ) {
    255                        if( ! DEF_POOL.isEmpty() ) {
    256                                DEF_POOL.clear();
    257                        }
    258                }
    259
    260                final ConnectionPool[] pools ;
    261                synchronized( map ) {
    262                        if( map.isEmpty() ) { return; }
    263
    264                        pools = map.values().toArray( new ConnectionPool[map.size()] ) ;
    265                        map.clear();
    266                }
    267
    268                ConnectionPool pool ;
    269                for( int i=0; i<pools.length ; i++ ) {
    270                        pool = pools[i];
    271                        if( pool != null && ! pool.isEmpty() ) {
    272                                pool.clear();
    273                        }
    274                }
    275        }
    276
    277        /**
    278         * ConnectionFactory の現在の状況(詳細メッセージ)を返します。
    279         * これは，コネクションプールの数(最大値，作成済み数など)を確認する為のものです。
    280         *
    281         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    282         *
    283         * @return  現在の状態表示
    284         */
    285        public static String information() {
    286                return information( true );
    287        }
    288
    289        /**
    290         * ConnectionFactory の現在の状況を返します。
    291         * これは，コネクションプールの数(最大値，作成済み数など)を確認する為のものです。
    292         * 引数により詳細メッセージかどうかを指定できます。
    293         *
    294         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    295         * @og.rev 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
    296         * @og.rev 5.6.7.3 (2013/08/23) 若干の修正
    297         *
    298         * @param       isDetail        詳細メッセージかどうか [true:詳細メッセージ/false:簡易メッセージ]
    299         *
    300         * @return  現在の状態表示
    301         */
    302        public static String information(final boolean isDetail ) {
    303                // 4.0.0.0 (2007/10/25) hybsとの依存関係を弱めるため。
    304                final StringBuilder strBuf = new StringBuilder( BUFFER_MIDDLE );
    305
    306                strBuf.append( "<b>【Connection Information】</b>" ).append( CR );    // 5.6.7.3 (2013/08/23) 若干の修正
    307
    308                int rtnCnt = 0;
    309                synchronized( DEF_POOL ) {
    310                        if( ! DEF_POOL.isEmpty() ) {
    311                                rtnCnt += DEF_POOL.size();
    312                                // 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
    313                                if( isDetail ) {
    314                                        strBuf.append( DEF_POOL.toString() );
    315                                        strBuf.append( "<br /><hr />" );
    316                                }
    317                                else {
    318                                        strBuf.append( DEF_POOL.dbidInfo() );
    319                                }
    320                        }
    321                }
    322
    323                ConnectionPool[] pools = null;
    324                synchronized( map ) {
    325                        if( !map.isEmpty() ) {
    326                                pools = map.values().toArray( new ConnectionPool[map.size()] ) ;
    327                        }
    328                }
    329
    330                if( pools != null ) {
    331                        for( int i=0; i<pools.length ; i++ ) {
    332                                ConnectionPool pool = pools[i];
    333                                if( pool != null && ! pool.isEmpty() ) {
    334                                        rtnCnt += pool.size();
    335                                        // 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
    336                                        if( isDetail ) {
    337                                                strBuf.append( pool.toString() );
    338                                                strBuf.append( "<br /><hr />" );
    339                                        }
    340                                        else {
    341                                                strBuf.append( pool.dbidInfo() );
    342                                        }
    343                                }
    344                        }
    345                }
    346
    347                strBuf.append( CR );
    348
    349                return strBuf.toString();
    350        }
    351
    352        /**
    353         * この接続が、PreparedStatement#getParameterMetaData() を使用するかどうかを判定します。
    354         *
    355         * PreparedStatement に対して、String化された 数字などを setObject( int,String ) するとき、
    356         * ORACLE と SQLServer は、そのまま設定すれば、自動的に変換されます。
    357         * postgreSQL では、ParameterMetaData#getParameterType(int) で、カラムタイプを取得し、
    358         * setObject( int,String,int ) する必要があります。
    359         * その判定に、このメソッドを使用します。
    360         * この結果は、あくまで、各種データベース毎の実地調査の結果を元に、判定結果を
    361         * 返すようにしています。
    362         * ORACLE の場合は、使用しない(false)が返るように設定しています。
    363         * SQLServer では、ORACLEと同様に、false を返します。
    364         *
    365         * このメソッドは、元々、ApplicationInfo#useParameterMetaData(Connection) に有ったものを
    366         * EDbid から取得するように修正したものです。
    367         *
    368         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
    369         *
    370         * @param dbid 接続先ID
    371         *
    372         * @return      [true:使用する/false:その他]
    373         */
    374        public static boolean useParameterMetaData( final String dbid ) {
    375                final String udbid ;
    376                if( dbid == null || dbid.length() == 0 ) {
    377                        udbid = DBID ;
    378                }
    379                else {
    380                        udbid = dbid.toUpperCase( Locale.JAPAN );       // 大文字化
    381                }
    382
    383                EDbid edbid = dbc.getDbid( udbid );
    384
    385                return edbid.useParamMetaData();
    386        }
    387
    388        /**
    389         * 接続先のDB名に対応した、enum (DBName) を返します(toUpperCase)。
    390         *
    391         * @og.rev 5.1.4.0 (2010/03/01) getDBFullName の代わりに新規作成
    392         * @og.rev 5.7.7.2 (2014/06/20) 最初の取得時のエラー回避
    393         *
    394         * @param dbid 接続先ID
    395         *
    396         * @return  接続先のDB名
    397         */
    398        public static String getDBName( final String dbid ) {
    399                final String dbName;
    400
    401                if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
    402                        dbName = DEF_POOL.getDBName();
    403                }
    404                else {
    405                        String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
    406                        ConnectionPool pool = null;
    407                        synchronized( map ) {
    408                                pool = map.get( udbid );
    409                                if( pool == null ) {
    410//                                      close( connection( dbid, null ), dbid );        // 5.7.7.2 (2014/06/20) 最初の取得時のエラー回避
    411                                        connection( dbid, null );       // ダミーで、コネクトする。
    412                                        pool = map.get( udbid );        // もう一度、設定する。
    413                                }
    414                        }
    415                        if( pool != null ) {
    416                                dbName = pool.getDBName();
    417                        }
    418                        else {
    419                                final String errMsg = "指定のDBIDキーに対応するデータベース名を取得出来ません。"
    420                                        + "[Key =" + dbid + "]";
    421                                throw new RuntimeException( errMsg );
    422                        }
    423                }
    424
    425                return dbName.toUpperCase( Locale.JAPAN );
    426        }
    427}
    428
    429/**
    430 * ConnectionPool は、AbstractObjectPool を継承した オブジェクトプールです。
    431 *
    432 * コネクションオブジェクトをプールすることにより、ConnectionFactory で
    433 * 管理する Map オブジェクトの実態として、各ID毎の コネクションをキープします。
    434 *
    435 * @og.group ＤＢ/Shell制御
    436 *
    437 * @version  4.0
    438 * @author   Kazuhiko Hasegawa
    439 * @since    JDK5.0,
    440 */
    441class ConnectionPool extends AbstractObjectPool<Connection> {
    442        private final transient EDbid edbid;
    443
    444        // 4.0.0.0 (2007/10/17) システム依存の改行記号をセットします。
    445        private static final String CR = System.getProperty( "line.separator" );
    446
    447        /**
    448         *  DBID を指定して作成する コンストラクター
    449         *  DBID をキーに､ HybsSystem.sys メソッドのデータベース変数を取得します。
    450         *  取得するのは､ DBID + _DB_URL／_DB_USER／_DB_PASSWD／_DB_MINCOUNT／_DB_MAXCOUNT
    451         *  です。
    452         *  DBID が null の場合は，"DEFAULT" が使用されます。
    453         *
    454         * @og.rev 3.5.4.3 (2004/01/05) キャッシュの寿命を指定
    455         * @og.rev 3.5.4.7 (2004/02/06) DBID のゼロストリングチェック追加
    456         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
    457         * @og.rev 4.0.0.0 (2007/10/25) DB設定情報のXML化に伴う変更
    458         *
    459         * @param   edbid 接続先情報オブジェクト
    460         */
    461        public ConnectionPool( final EDbid edbid ) {
    462                // 4.0.0.0 XML化に伴いロード先を変更
    463                this.edbid      =       edbid;
    464                init( edbid.getMincount(),edbid.getMaxcount(),true,edbid.getPooltime() );
    465        }
    466
    467        /**
    468         * オブジェクトプールから削除するときに呼ばれます。
    469         * このメソッドで各オブジェクトごとの終了処理を行います。
    470         * 例えば､データベースコネクションであれば､close() 処理などです。
    471         *
    472         * @og.rev 3.5.4.8 (2004/02/23) SQLException は無視します。
    473         * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除します。
    474         *
    475         * @param  obj 終了処理を行うオブジェクト
    476         */
    477        protected void objectFinal( final Connection obj ) {
    478                Closer.connClose( obj );
    479        }
    480
    481        /**
    482         * コネクションオブジェクトを作成します。
    483         * DriverManager.getConnection により作成されたConnection を Connection で
    484         * ラッピングします。
    485         * Connectionオブジェクトは,close()メソッドで,自分自身を ConnectionFactory の
    486         * プールに戻します。
    487         *
    488         * @og.rev 3.3.3.3 (2003/08/06) コネクションに対して、setTransactionIsolation を、設定しておく。
    489         * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
    490         * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除します。
    491         * @og.rev 3.8.8.2 (2007/01/26) useAppInfo を設定します。
    492         * @og.rev 4.0.0.0 (2007/10/30) 保持情報オブジェクト化に伴う変更
    493         * @og.rev 5.1.2.0 (2010/01/01) MySQL対応 明示的に、TRANSACTION_READ_COMMITTED を指定する。
    494         * @og.rev 5.5.2.0 (2012/05/01) properties対応
    495         *
    496         * @return  コネクションオブジェクト
    497         */
    498        protected Connection createInstance() {
    499                Connection conn = null;
    500                try {
    501        //              DriverManager.setLogWriter( HybsSystem.out );                   // ドライバーのログ
    502
    503                        // 5.5.2.0 (2012/05/01) propertyの追加処理と、接続のproperties化
    504                        Properties prop = new Properties (edbid.getProps());
    505                        prop.put ( "user", edbid.getUser() );
    506                        prop.put ( "password", edbid.getPassword() );
    507
    508                        conn = DriverManager.getConnection( edbid.getUrl(), prop );
    509        //              conn.setReadOnly( true );
    510                        conn.setReadOnly( edbid.isReadonly() );
    511
    512                        conn.setAutoCommit( false );
    513                        conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  // 初期値
    514        //              ((OracleConnection)conn).setDefaultExecuteBatch(1);  // 初期値
    515        //              ((OracleConnection)conn).setDefaultRowPrefetch(20);  // 初期値
    516
    517                        // 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
    518                        // 4.0.0.0 (2007/10/26) 登録先をオブジェクト化
    519                        if( edbid.getDbProductName() == null ) {
    520                                DatabaseMetaData meta = conn.getMetaData();
    521                                edbid.setMetaDataInfo( meta );
    522                        }
    523                        return conn ;
    524                }
    525                catch ( SQLException ex ) {
    526                        String errMsg = "コネクトすることが出来ません。" + CR
    527                                                + "DBID=[" + edbid.getDbidKey() + "]" + CR
    528                                                + ex.getMessage() + " , status=" + ex.getSQLState();
    529                        Closer.connClose( conn );
    530                        throw new RuntimeException( errMsg,ex );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
    531                }
    532        }
    533
    534        /**
    535         * アクセスログ取得の為のDBMS_APPLICATION_INFOの使用可否を取得します(初期値:true)。
    536         *
    537         * データベースへのアクセスログ取得の為、エンジンで接続するコネクションについて
    538         * DBMS_APPLICATION_INFO.SET_CLIENT_INFO と SET_MODULE を呼び出しています。
    539         * この処理は、ORACLEとの接続のみ有効ですので、接続先データベースが ORACLE 以外は
    540         * false を返します。
    541         * ORACLE の場合は、システムリソースの USE_DB_APPLICATION_INFO 属性の設定値を
    542         * 返します。
    543         * この設定値の初期値は、true です。
    544         *
    545         * @og.rev 3.8.8.2 (2007/01/26) 新規追加
    546         *
    547         * @return  true:使用する/false:使用しない
    548         */
    549        public boolean useApplicationInfo() { return edbid.isApplicationInfo(); }
    550
    551        /**
    552         * 接続先のDB名を返します。
    553         *
    554         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
    555         *
    556         * @return  接続先のDB名
    557         */
    558        public String getDBName() {
    559                return edbid.getDbProductName();
    560        }
    561
    562        /**
    563         * 接続先のDBバージョンを返します。
    564         *
    565         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
    566         *
    567         * @return 接続先のDBバージョン
    568         */
    569        public String getDBVersion() {
    570                return edbid.getDbProductVersion();
    571        }
    572
    573        /**
    574         * 接続先の簡易な内部情報を返します。
    575         *
    576         * @og.rev 5.3.4.0 (2011/04/01) toString() の簡易版
    577         *
    578         * @return 接続先の簡易な内部情報
    579         */
    580        public String dbidInfo() {
    581                return edbid.info();
    582        }
    583
    584        /**
    585         * 内部状況を簡易的に表現した文字列を返します。
    586         * DBID／URL／USER／プールサイズ を返します。
    587         *
    588         * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
    589         * @og.rev 3.5.6.6 (2004/08/23) 同期化方法を統一する為、synchronized をつけます。(別途 要検討)
    590         * @og.rev 4.0.0.0 (2007/10/29) EDbidのtoStringを呼ぶように変更
    591         *
    592         * @return   このオブジェクトプールの文字列表現
    593         */
    594        @Override
    595        public String toString() {
    596                StringBuilder buf = new StringBuilder();
    597                buf.append( edbid.toString() );
    598                buf.append( super.toString() );
    599                return buf.toString();
    600        }
    601}