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 DB/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         * 1)第二引数にXMLファイルをクラスローダ基底からの相対パスで指定した場合は
084         *   そのXMLを利用してDBConfigオブジェクトを作成します。例:ConnectionFactory.init( CONTEXT_NAME, "../DBConfig.xml")
085         *   nullの場合はWEB-INF/DBConfig.xmlを利用します。例:ConnectionFactory.init( CONTEXT_NAME, null)
086         * 2)キャッシュ初期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         *
190         * @param   conn コネクションオブジェクト
191         * @param   dbid 接続先ID
192         */
193        public static void close( final Connection conn,final String dbid ) {
194                if( conn != null ) {
195                        if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
196                                DEF_POOL.release( conn ) ;
197                        }
198                        else {
199                                String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
200                                synchronized( map ) {
201                                        ConnectionPool pool = map.get( udbid );
202                                        if( pool != null ) {
203                                                pool.release( conn );
204                                        }
205                                }
206                        }
207                }
208        }
209
210        /**
211         * コネクションオブジェクトを物理的に削除(クローズ)戻します。
212         * これは、コネクション等がエラーを起こした場合に、プールに戻すのではなく、
213         * 接続を閉じる場合に、使用されます。
214         *
215         * @og.rev 2.1.1.3 (2002/11/22) コネクションID が null の場合に DEFAULT から所得するように変更。
216         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
217         * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大文字に変換する。
218         *
219         * @param   conn コネクションオブジェクト
220         * @param   dbid 接続先ID
221         */
222        public static void remove( final Connection conn,final String dbid ) {
223                if( conn != null ) {
224                        if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
225                                DEF_POOL.remove( conn ) ;
226                        }
227                        else {
228                                String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
229                                synchronized( map ) {
230                                        ConnectionPool pool = map.get( udbid );
231                                        if( pool != null ) {
232                                                pool.remove( conn );
233                //                              map.put( udbid,pool );
234                                        }
235                                }
236                        }
237                }
238        }
239
240        /**
241         * コネクションオブジェクトを実際にすべてクローズします。
242         * コネクションプールの再編成や,管理者による強制クローズに使用します。
243         *
244         * クローズに失敗(コネクションが貸し出し中)の場合は,内部的に
245         * DB_CLOSE_RETRY_TIME だけ待機して, DB_CLOSE_RETRY_COUNT 回数だけ,試行します。
246         * それでもクローズできない場合は, RuntimeException を throw します。
247         *
248         * @og.rev 4.0.0.0 (2005/01/31) ロジック見直し。 pool.clear() で、基本的にはすべて削除されます。
249         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
250         */
251        public static void realClose() {
252                synchronized( DEF_POOL ) {
253                        if( ! DEF_POOL.isEmpty() ) {
254                                DEF_POOL.clear();
255                        }
256                }
257
258                final ConnectionPool[] pools ;
259                synchronized( map ) {
260                        if( map.isEmpty() ) { return; }
261
262                        pools = map.values().toArray( new ConnectionPool[map.size()] ) ;
263                        map.clear();
264                }
265
266                ConnectionPool pool ;
267                for( int i=0; i<pools.length ; i++ ) {
268                        pool = pools[i];
269                        if( pool != null && ! pool.isEmpty() ) {
270                                pool.clear();
271                        }
272                }
273        }
274
275        /**
276         * ConnectionFactory の現在の状況(詳細メッセージ)を返します。
277         * これは,コネクションプールの数(最大値,作成済み数など)を確認する為のものです。
278         *
279         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
280         *
281         * @return  現在の状態表示
282         */
283        public static String information() {
284                return information( true );
285        }
286
287        /**
288         * ConnectionFactory の現在の状況を返します。
289         * これは,コネクションプールの数(最大値,作成済み数など)を確認する為のものです。
290         * 引数により詳細メッセージかどうかを指定できます。
291         *
292         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
293         * @og.rev 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
294         * @og.rev 5.6.7.3 (2013/08/23) 若干の修正
295         *
296         * @param       isDetail        詳細メッセージかどうか [true:詳細メッセージ/false:簡易メッセージ]
297         *
298         * @return  現在の状態表示
299         */
300        public static String information(final boolean isDetail ) {
301                // 4.0.0.0 (2007/10/25) hybsとの依存関係を弱めるため。
302                final StringBuilder strBuf = new StringBuilder( BUFFER_MIDDLE );
303
304                strBuf.append( "<b>【Connection Information】</b>" ).append( CR );    // 5.6.7.3 (2013/08/23) 若干の修正
305
306                int rtnCnt = 0;
307                synchronized( DEF_POOL ) {
308                        if( ! DEF_POOL.isEmpty() ) {
309                                rtnCnt += DEF_POOL.size();
310                                // 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
311                                if( isDetail ) {
312                                        strBuf.append( DEF_POOL.toString() );
313                                        strBuf.append( "<br /><hr />" );
314                                }
315                                else {
316                                        strBuf.append( DEF_POOL.dbidInfo() );
317                                }
318                        }
319                }
320
321                ConnectionPool[] pools = null;
322                synchronized( map ) {
323                        if( !map.isEmpty() ) {
324                                pools = map.values().toArray( new ConnectionPool[map.size()] ) ;
325                        }
326                }
327
328                if( pools != null ) {
329                        for( int i=0; i<pools.length ; i++ ) {
330                                ConnectionPool pool = pools[i];
331                                if( pool != null && ! pool.isEmpty() ) {
332                                        rtnCnt += pool.size();
333                                        // 5.3.4.0 (2011/04/01) 詳細メッセージ用引数を追加
334                                        if( isDetail ) {
335                                                strBuf.append( pool.toString() );
336                                                strBuf.append( "<br /><hr />" );
337                                        }
338                                        else {
339                                                strBuf.append( pool.dbidInfo() );
340                                        }
341                                }
342                        }
343                }
344
345                strBuf.append( CR );
346
347                return strBuf.toString();
348        }
349
350        /**
351         * この接続が、PreparedStatement#getParameterMetaData() を使用するかどうかを判定します。
352         *
353         * PreparedStatement に対して、String化された 数字などを setObject( int,String ) するとき、
354         * ORACLE と SQLServer は、そのまま設定すれば、自動的に変換されます。
355         * postgreSQL では、ParameterMetaData#getParameterType(int) で、カラムタイプを取得し、
356         * setObject( int,String,int ) する必要があります。
357         * その判定に、このメソッドを使用します。
358         * この結果は、あくまで、各種データベース毎の実地調査の結果を元に、判定結果を
359         * 返すようにしています。
360         * ORACLE の場合は、使用しない(false)が返るように設定しています。
361         * SQLServer では、ORACLEと同様に、false を返します。
362         *
363         * このメソッドは、元々、ApplicationInfo#useParameterMetaData(Connection) に有ったものを
364         * EDbid から取得するように修正したものです。
365         *
366         * @og.rev 5.3.8.0 (2011/08/01) 新規追加
367         *
368         * @param dbid 接続先ID
369         *
370         * @return      [true:使用する/false:その他]
371         */
372        public static boolean useParameterMetaData( final String dbid ) {
373                final String udbid ;
374                if( dbid == null || dbid.length() == 0 ) {
375                        udbid = DBID ;
376                }
377                else {
378                        udbid = dbid.toUpperCase( Locale.JAPAN );       // 大文字化
379                }
380
381                EDbid edbid = dbc.getDbid( udbid );
382
383                return edbid.useParamMetaData();
384        }
385
386        /**
387         * 接続先のDB名に対応した、enum (DBName) を返します(toUpperCase)。
388         *
389         * @og.rev 5.1.4.0 (2010/03/01) getDBFullName の代わりに新規作成
390         * @og.rev 5.7.7.2 (2014/06/20) 最初の取得時のエラー回避
391         *
392         * @param dbid 接続先ID
393         *
394         * @return  接続先のDB名
395         */
396        public static String getDBName( final String dbid ) {
397                final String dbName;
398
399                if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
400                        dbName = DEF_POOL.getDBName();
401                }
402                else {
403                        String udbid = dbid.toUpperCase( Locale.JAPAN );        // 大文字化
404                        ConnectionPool pool = null;
405                        synchronized( map ) {
406                                pool = map.get( udbid );
407                                if( pool == null ) {
408//                                      close( connection( dbid, null ), dbid );        // 5.7.7.2 (2014/06/20) 最初の取得時のエラー回避
409                                        connection( dbid, null );       // ダミーで、コネクトする。
410                                        pool = map.get( udbid );        // もう一度、設定する。
411                                }
412                        }
413                        if( pool != null ) {
414                                dbName = pool.getDBName();
415                        }
416                        else {
417                                final String errMsg = "指定のDBIDキーに対応するデータベース名を取得出来ません。"
418                                        + "[Key =" + dbid + "]";
419                                throw new RuntimeException( errMsg );
420                        }
421                }
422
423                return dbName.toUpperCase( Locale.JAPAN );
424        }
425}
426
427/**
428 * ConnectionPool は、AbstractObjectPool を継承した オブジェクトプールです。
429 *
430 * コネクションオブジェクトをプールすることにより、ConnectionFactory で
431 * 管理する Map オブジェクトの実態として、各ID毎の コネクションをキープします。
432 *
433 * @og.group DB/Shell制御
434 *
435 * @version  4.0
436 * @author   Kazuhiko Hasegawa
437 * @since    JDK5.0,
438 */
439class ConnectionPool extends AbstractObjectPool<Connection> {
440        private final transient EDbid edbid;
441
442        // 4.0.0.0 (2007/10/17) システム依存の改行記号をセットします。
443        private static final String CR = System.getProperty( "line.separator" );
444
445        /**
446         *  DBID を指定して作成する コンストラクター
447         *  DBID をキーに、 HybsSystem.sys メソッドのデータベース変数を取得します。
448         *  取得するのは、 DBID + _DB_URL/_DB_USER/_DB_PASSWD/_DB_MINCOUNT/_DB_MAXCOUNT
449         *  です。
450         *  DBID が null の場合は,"DEFAULT" が使用されます。
451         *
452         * @og.rev 3.5.4.3 (2004/01/05) キャッシュの寿命を指定
453         * @og.rev 3.5.4.7 (2004/02/06) DBID のゼロストリングチェック追加
454         * @og.rev 4.0.0.0 (2007/10/10) キャッシュされた、初期ConnectionPool を使用
455         * @og.rev 4.0.0.0 (2007/10/25) DB設定情報のXML化に伴う変更
456         *
457         * @param   edbid 接続先情報オブジェクト
458         */
459        public ConnectionPool( final EDbid edbid ) {
460                // 4.0.0.0 XML化に伴いロード先を変更
461                this.edbid      =       edbid;
462                init( edbid.getMincount(),edbid.getMaxcount(),true,edbid.getPooltime() );
463        }
464
465        /**
466         * オブジェクトプールから削除するときに呼ばれます。
467         * このメソッドで各オブジェクトごとの終了処理を行います。
468         * 例えば、データベースコネクションであれば、close() 処理などです。
469         *
470         * @og.rev 3.5.4.8 (2004/02/23) SQLException は無視します。
471         * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除します。
472         *
473         * @param  obj 終了処理を行うオブジェクト
474         */
475        protected void objectFinal( final Connection obj ) {
476                Closer.connClose( obj );
477        }
478
479        /**
480         * コネクションオブジェクトを作成します。
481         * DriverManager.getConnection により作成されたConnection を Connection で
482         * ラッピングします。
483         * Connectionオブジェクトは,close()メソッドで,自分自身を ConnectionFactory の
484         * プールに戻します。
485         *
486         * @og.rev 3.3.3.3 (2003/08/06) コネクションに対して、setTransactionIsolation を、設定しておく。
487         * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
488         * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除します。
489         * @og.rev 3.8.8.2 (2007/01/26) useAppInfo を設定します。
490         * @og.rev 4.0.0.0 (2007/10/30) 保持情報オブジェクト化に伴う変更
491         * @og.rev 5.1.2.0 (2010/01/01) MySQL対応 明示的に、TRANSACTION_READ_COMMITTED を指定する。
492         * @og.rev 5.5.2.0 (2012/05/01) properties対応
493         *
494         * @return  コネクションオブジェクト
495         */
496        protected Connection createInstance() {
497                Connection conn = null;
498                try {
499        //              DriverManager.setLogWriter( HybsSystem.out );                   // ドライバーのログ
500
501                        // 5.5.2.0 (2012/05/01) propertyの追加処理と、接続のproperties化
502                        Properties prop = new Properties (edbid.getProps());
503                        prop.put ( "user", edbid.getUser() );
504                        prop.put ( "password", edbid.getPassword() );
505
506                        conn = DriverManager.getConnection( edbid.getUrl(), prop );
507        //              conn.setReadOnly( true );
508                        conn.setReadOnly( edbid.isReadonly() );
509
510                        conn.setAutoCommit( false );
511                        conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  // 初期値
512        //              ((OracleConnection)conn).setDefaultExecuteBatch(1);  // 初期値
513        //              ((OracleConnection)conn).setDefaultRowPrefetch(20);  // 初期値
514
515                        // 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
516                        // 4.0.0.0 (2007/10/26) 登録先をオブジェクト化
517                        if( edbid.getDbProductName() == null ) {
518                                DatabaseMetaData meta = conn.getMetaData();
519                                edbid.setMetaDataInfo( meta );
520                        }
521                        return conn ;
522                }
523                catch ( SQLException ex ) {
524                        String errMsg = "コネクトすることが出来ません。" + CR
525                                                + "DBID=[" + edbid.getDbidKey() + "]" + CR
526                                                + ex.getMessage() + " , status=" + ex.getSQLState();
527                        Closer.connClose( conn );
528                        throw new RuntimeException( errMsg,ex );                // 3.5.5.4 (2004/04/15) 引数の並び順変更
529                }
530        }
531
532        /**
533         * アクセスログ取得の為のDBMS_APPLICATION_INFOの使用可否を取得します(初期値:true)。
534         *
535         * データベースへのアクセスログ取得の為、エンジンで接続するコネクションについて
536         * DBMS_APPLICATION_INFO.SET_CLIENT_INFO と SET_MODULE を呼び出しています。
537         * この処理は、ORACLEとの接続のみ有効ですので、接続先データベースが ORACLE 以外は
538         * false を返します。
539         * ORACLE の場合は、システムリソースの USE_DB_APPLICATION_INFO 属性の設定値を
540         * 返します。
541         * この設定値の初期値は、true です。
542         *
543         * @og.rev 3.8.8.2 (2007/01/26) 新規追加
544         *
545         * @return  true:使用する/false:使用しない
546         */
547        public boolean useApplicationInfo() { return edbid.isApplicationInfo(); }
548
549        /**
550         * 接続先のDB名を返します。
551         *
552         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
553         *
554         * @return  接続先のDB名
555         */
556        public String getDBName() {
557                return edbid.getDbProductName();
558        }
559
560        /**
561         * 接続先のDBバージョンを返します。
562         *
563         * @og.rev 4.3.7.0 (2009/06/01) 新規作成
564         *
565         * @return 接続先のDBバージョン
566         */
567        public String getDBVersion() {
568                return edbid.getDbProductVersion();
569        }
570
571        /**
572         * 接続先の簡易な内部情報を返します。
573         *
574         * @og.rev 5.3.4.0 (2011/04/01) toString() の簡易版
575         *
576         * @return 接続先の簡易な内部情報
577         */
578        public String dbidInfo() {
579                return edbid.info();
580        }
581
582        /**
583         * 内部状況を簡易的に表現した文字列を返します。
584         * DBID/URL/USER/プールサイズ を返します。
585         *
586         * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベース名、ドライバ名情報を追加する。
587         * @og.rev 3.5.6.6 (2004/08/23) 同期化方法を統一する為、synchronized をつけます。(別途 要検討)
588         * @og.rev 4.0.0.0 (2007/10/29) EDbidのtoStringを呼ぶように変更
589         *
590         * @return   このオブジェクトプールの文字列表現
591         */
592        @Override
593        public String toString() {
594                StringBuilder buf = new StringBuilder();
595                buf.append( edbid.toString() );
596                buf.append( super.toString() );
597                return buf.toString();
598        }
599}