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 */
016 package org.opengion.fukurou.db;
017
018 import org.opengion.fukurou.util.AbstractObjectPool;
019 import org.opengion.fukurou.util.ApplicationInfo;
020 import org.opengion.fukurou.util.Closer;
021
022 import java.util.Map;
023 import java.util.HashMap;
024 import java.util.Locale;
025 import java.util.Properties;
026 import java.sql.Connection;
027 import java.sql.SQLException;
028 import java.sql.DriverManager;
029 import 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 */
056 public 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 * 初期化メソãƒ?ƒ‰ですã?<BR/>
082 *
083 * ??第二引数にXMLファイルをクラスローãƒ?Ÿº底からã?相対パスでæŒ?®šしたå?合ã?<BR/>
084 * ã€??そã?XMLを利用してDBConfigオブジェクトを作æ?しますã?例:ConnectionFactory.init( CONTEXT_NAME, "../DBConfig.xml")<BR/>
085 * ã€??nullの場合ã?WEB-INF/DBConfig.xmlを利用しますã?例:ConnectionFactory.init( CONTEXT_NAME, null)<BR/>
086 * ??キャãƒ?‚·ュ初期ConnectionPoolのキーを設定してキャãƒ?‚·ュプã?ルを作りますã?<BR/>
087 * ã€??こã?値がnullの場合ã?"DEFAULT"が設定されますã?
088 * <BR/>
089 * <strong>こã?クラスを利用する場合ã?å¿?�šæœ??にこã?メソãƒ?ƒ‰を実行するå¿?¦�がありますã?</strong><BR/>
090 * キャãƒ?‚·ュとDBConfigオブジェクトã?同期化ã?されてã�?�ªã�??で初期化以外での利用は避けて下さã�??<BR/>
091 *
092 * @og.rev 4.0.0.0 (2007/11/05) 新規作æ?
093 *
094 * @param defPoolKey 初期DBIDå�?nullの場合ã?ã€?DEFAULT")
095 * @param XmlFileName DBConfig.xmlファイルのファイルå�?nullの場合ã?、WEB-INF/DBConfig.xml)
096 */
097 public static void init( final String defPoolKey, final String XmlFileName ) {
098 // DBConfigオブジェクトã?作æ?
099 if( XmlFileName == null || XmlFileName.length() == 0 ) {
100 dbc = new DatabaseConfig();
101 }
102 else {
103 dbc = new DatabaseConfig( XmlFileName );
104 }
105
106 if( defPoolKey == null || defPoolKey.length() == 0 || dbc.getDbid( defPoolKey ) == null ) {
107 DBID = "DEFAULT";
108 }
109 else {
110 DBID = defPoolKey;
111 }
112 EDbid edbid = dbc.getDbid( DBID );
113 if( edbid == null ) {
114 final String errMsg = "初期化時に、指定ã?DBIDキーが存在しませんã€?
115 + "[Key ="
116 + DBID
117 + "]";
118 throw new RuntimeException( errMsg );
119 }
120
121 DEF_POOL = new ConnectionPool( edbid );
122 }
123
124 /**
125 * コネクションオブジェクトを取得しますã?
126 * é�?�„初期化を行なã�?º‹により,実際にå¿?¦�となるまでコネクションオブジェクトã?
127 * 作æ?しませんã€?
128 * æœ?¤§プã?ル数に達して,なおかつ,すべてのConnectionが貸しå?し中の場å�?
129 *
130 * @og.rev 2.1.1.3 (2002/11/22) コネクションID ã�?null の場合に DEFAULT からæ‰?¾—するよã�?�«変更ã€?
131 * @og.rev 3.1.0.0 (2003/03/20) Hashtable を使用してã�?‚‹ç®?‰€でã€?�ž同期でも構わなã�?®?‰€をã?HashMap に置換えã€?
132 * @og.rev 3.5.6.2 (2004/07/05) æ–?—å?の連結にStringBuilderを使用しますã?
133 * @og.rev 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを設å®?
134 * @og.rev 3.8.8.2 (2007/01/26) USE_DB_APPLICATION_INFO â‡?pool.useApplicationInfo() 変更
135 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
136 * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大æ–?—に変換するã€?
137 *
138 * @param dbid 接続å?ID
139 * @param appInfo アプリæƒ??オブジェクãƒ?
140 *
141 * @return コネクションオブジェクãƒ?
142 */
143 public static Connection connection( final String dbid , final ApplicationInfo appInfo ) {
144 ConnectionPool pool ;
145 if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
146 pool = DEF_POOL ;
147 }
148 else {
149 String udbid = dbid.toUpperCase( Locale.JAPAN ); // 大æ–?—化
150 synchronized( map ) {
151 pool = map.get( udbid );
152 // 接続IDがã?map に存在しなã�??å�?
153 if( pool == null ) {
154 EDbid edbid = dbc.getDbid( udbid );
155 if( edbid == null ) {
156 final String errMsg = "æŒ?®šã?DBIDキーが存在しませんã€?
157 + "[Key ="
158 + udbid
159 + "]";
160 throw new RuntimeException( errMsg );
161 }
162 pool = new ConnectionPool( edbid );
163 map.put( udbid,pool );
164 }
165 }
166 }
167
168 Connection conn = pool.newInstance();
169
170 // 3.8.7.0 (2006/12/15) アクセスログ取得ã?為,ApplicationInfoオブジェクトを使用
171 // 3.8.8.2 (2007/01/26) ORACLE 以外ã?、使用しませんã€?
172 // 4.0.0.0 (2007/11/29) 入れ子if の統å�?
173 if( appInfo != null && pool.useApplicationInfo() ) {
174 appInfo.callAppInfo( conn );
175 }
176 return conn;
177 }
178
179 /**
180 * コネクションオブジェクトをプã?ルに戻しますã?
181 * Connectionオブジェクトã?,close()メソãƒ?ƒ‰で,自åˆ??身ã‚?ConnectionFactory の
182 * プã?ルに戻しますã?
183 * それ以外ã? コネクションオブジェクトをプã?ルに戻すå?合ã?,こã?メソãƒ?ƒ‰を使用しますã?
184 *
185 * @og.rev 2.1.1.3 (2002/11/22) コネクションID ã�?null の場合に DEFAULT からæ‰?¾—するよã�?�«変更ã€?
186 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
187 * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大æ–?—に変換するã€?
188 *
189 * @param conn コネクションオブジェクãƒ?
190 * @param dbid 接続å?ID
191 */
192 public static void close( final Connection conn,final String dbid ) {
193 if( conn != null ) {
194 if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
195 DEF_POOL.release( conn ) ;
196 }
197 else {
198 String udbid = dbid.toUpperCase( Locale.JAPAN ); // 大æ–?—化
199 synchronized( map ) {
200 ConnectionPool pool = map.get( udbid );
201 if( pool != null ) {
202 pool.release( conn );
203 }
204 }
205 }
206 }
207 }
208
209 /**
210 * コネクションオブジェクトを物ç�?š„に削除(クローズ)戻しますã?
211 * これは、コネクション等がエラーを起こしたå?合に、ã?ールに戻すã?ではなくã?
212 * 接続を閉じるå?合に、使用されますã?
213 *
214 * @og.rev 2.1.1.3 (2002/11/22) コネクションID ã�?null の場合に DEFAULT からæ‰?¾—するよã�?�«変更ã€?
215 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
216 * @og.rev 4.1.0.1 (2008/01/21) 登録時に、大æ–?—に変換するã€?
217 *
218 * @param conn コネクションオブジェクãƒ?
219 * @param dbid 接続å?ID
220 */
221 public static void remove( final Connection conn,final String dbid ) {
222 if( conn != null ) {
223 if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
224 DEF_POOL.remove( conn ) ;
225 }
226 else {
227 String udbid = dbid.toUpperCase( Locale.JAPAN ); // 大æ–?—化
228 synchronized( map ) {
229 ConnectionPool pool = map.get( udbid );
230 if( pool != null ) {
231 pool.remove( conn );
232 // map.put( udbid,pool );
233 }
234 }
235 }
236 }
237 }
238
239 /**
240 * コネクションオブジェクトを実際にすべてクローズしますã?
241 * コネクションプã?ルの再編成や?Œ管ç�??による強制クローズに使用しますã?
242 *
243 * クローズに失æ•?コネクションが貸しå?し中)の場合ã?,å†?ƒ¨çš?�«
244 * DB_CLOSE_RETRY_TIME ã�?�‘å¾?©Ÿして, DB_CLOSE_RETRY_COUNT 回数ã�?�‘,試行しますã?
245 * それでもクローズできなã�??合ã?, RuntimeException ã‚?throw しますã?
246 *
247 * @og.rev 4.0.0.0 (2005/01/31) ロジãƒ?‚¯見直しã? pool.clear() で、基本çš?�«はすべて削除されますã?
248 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
249 */
250 public static void realClose() {
251 synchronized( DEF_POOL ) {
252 if( ! DEF_POOL.isEmpty() ) {
253 DEF_POOL.clear();
254 }
255 }
256
257 final ConnectionPool[] pools ;
258 synchronized( map ) {
259 if( map.isEmpty() ) { return; }
260
261 pools = map.values().toArray( new ConnectionPool[map.size()] ) ;
262 map.clear();
263 }
264
265 ConnectionPool pool ;
266 for( int i=0; i<pools.length ; i++ ) {
267 pool = pools[i];
268 if( pool != null && ! pool.isEmpty() ) {
269 pool.clear();
270 }
271 }
272 }
273
274 /**
275 * ConnectionFactory の現在の状æ³?詳細メãƒ?‚»ージ)を返しますã?
276 * これは?Œコネクションプã?ルの数(æœ?¤§値?Œ作æ?済み数など)を確認する為のもã?ですã?
277 *
278 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
279 *
280 * @return 現在の状態表示
281 */
282 public static String information() {
283 return information( true );
284 }
285
286 /**
287 * ConnectionFactory の現在の状況を返しますã?
288 * これは?Œコネクションプã?ルの数(æœ?¤§値?Œ作æ?済み数など)を確認する為のもã?ですã?
289 * 引数により詳細メãƒ?‚»ージかどã�?�‹を指定できますã?
290 *
291 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
292 * @og.rev 5.3.4.0 (2011/04/01) 詳細メãƒ?‚»ージ用引数を追åŠ?
293 * @og.rev 5.6.7.3 (2013/08/23) 若干の修正
294 *
295 * @param isDetail 詳細メãƒ?‚»ージかどã�?�‹ [true:詳細メãƒ?‚»ージ/false:簡易メãƒ?‚»ージ]
296 *
297 * @return 現在の状態表示
298 */
299 public static String information(final boolean isDetail ) {
300 // 4.0.0.0 (2007/10/25) hybsとの依存関係を弱めるためã€?
301 final StringBuilder strBuf = new StringBuilder( BUFFER_MIDDLE );
302
303 // strBuf.append( "Connection Information :" ).append( CR );
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 *
391 * @param dbid 接続å?ID
392 *
393 * @return 接続å?のDBå�?
394 */
395 public static String getDBName( final String dbid ) {
396 final String dbName;
397
398 if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
399 dbName = DEF_POOL.getDBName();
400 }
401 else {
402 String udbid = dbid.toUpperCase( Locale.JAPAN ); // 大æ–?—化
403 ConnectionPool pool = null;
404 synchronized( map ) {
405 pool = map.get( udbid );
406 if( pool == null ) {
407 close( connection( dbid, null ), dbid );
408 }
409 }
410 if( pool != null ) {
411 dbName = pool.getDBName();
412 }
413 else {
414 final String errMsg = "æŒ?®šã?DBIDキーに対応するデータベã?ス名を取得å?来ませんã€?
415 + "[Key =" + dbid + "]";
416 throw new RuntimeException( errMsg );
417 }
418 }
419
420 return dbName.toUpperCase( Locale.JAPAN );
421 }
422
423 /**
424 * 接続å?のDB名を返しますã?
425 *
426 * @og.rev 4.3.7.0 (2009/06/01) 新規作æ?
427 * @og.rev 5.1.4.0 (2010/03/01) å»?¢
428 *
429 * @param dbid 接続å?ID
430 *
431 * @return 接続å?のDBå�?バã?ジョン
432 */
433 // public static String getDBFullName( final String dbid ) {
434 // String dbName = null;
435 //
436 // if( dbid == null || dbid.length() == 0 || DBID.equalsIgnoreCase( dbid ) ) {
437 // dbName = DEF_POOL.getDBName() + " " + DEF_POOL.getDBVersion();
438 // }
439 // else {
440 // String udbid = dbid.toUpperCase( Locale.JAPAN ); // 大æ–?—化
441 // ConnectionPool pool = null;
442 // synchronized( map ) {
443 // pool = map.get( udbid );
444 // if( pool == null ) {
445 // close( connection( dbid, null ), dbid );
446 // }
447 // }
448 // if( pool != null ) {
449 // dbName = pool.getDBName() + " " + pool.getDBVersion();
450 // }
451 // }
452 // return dbName;
453 // }
454 }
455
456 /**
457 * ConnectionPool は、AbstractObjectPool を継承した オブジェクトã?ールですã?
458 *
459 * コネクションオブジェクトをプã?ルすることにより、ConnectionFactory で
460 * 管ç�?�™ã‚?Map オブジェクトã?実æ?として、各ID毎ã? コネクションをキープしますã?
461 *
462 * @og.group ?¤?¢/Shell制御
463 *
464 * @version 4.0
465 * @author Kazuhiko Hasegawa
466 * @since JDK5.0,
467 */
468 class ConnectionPool extends AbstractObjectPool<Connection> {
469 private final transient EDbid edbid;
470
471 // 4.0.0.0 (2007/10/17) シスãƒ?ƒ 依存ã?改行記号をセãƒ?ƒˆしますã?
472 private static final String CR = System.getProperty( "line.separator" );
473
474 /**
475 * DBID を指定して作æ?する コンストラクター
476 * DBID をキーに?¤ HybsSystem.sys メソãƒ?ƒ‰のãƒ??タベã?ス変数を取得しますã?
477 * 取得するã?は?¤ DBID + _DB_URL?�_DB_USER?�_DB_PASSWD?�_DB_MINCOUNT?�_DB_MAXCOUNT
478 * ですã?
479 * DBID ã�?null の場合ã???DEFAULT" が使用されますã?
480 *
481 * @og.rev 3.5.4.3 (2004/01/05) キャãƒ?‚·ュの寿命を指å®?
482 * @og.rev 3.5.4.7 (2004/02/06) DBID のゼロストリングチェãƒ?‚¯追åŠ?
483 * @og.rev 4.0.0.0 (2007/10/10) キャãƒ?‚·ュされたã?初期ConnectionPool を使用
484 * @og.rev 4.0.0.0 (2007/10/25) DB設定情報のXML化に伴ã�?¤‰更
485 *
486 * @param edbid 接続å?æƒ??オブジェクãƒ?
487 */
488 public ConnectionPool( final EDbid edbid ) {
489 // 4.0.0.0 XML化に伴ã�?ƒードå?を変更
490 this.edbid = edbid;
491 init( edbid.getMincount(),edbid.getMaxcount(),true,edbid.getPooltime() );
492 }
493
494 /**
495 * オブジェクトã?ールから削除するときに呼ばれますã?
496 * こã?メソãƒ?ƒ‰でå�?‚ªブジェクトごとの終äº??ç�?‚’行いますã?
497 * 例えば?¤ãƒ??タベã?スコネクションであれば?¤close() 処ç�?�ªどですã?
498 *
499 * @og.rev 3.5.4.8 (2004/02/23) SQLException は無視しますã?
500 * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除しますã?
501 *
502 * @param obj 終äº??ç�?‚’行うオブジェクãƒ?
503 */
504 protected void objectFinal( final Connection obj ) {
505 Closer.connClose( obj );
506 }
507
508 /**
509 * コネクションオブジェクトを作æ?しますã?
510 * DriverManager.getConnection により作æ?されたConnection ã‚?Connection で
511 * ラãƒ?ƒ”ングしますã?
512 * Connectionオブジェクトã?,close()メソãƒ?ƒ‰で,自åˆ??身ã‚?ConnectionFactory の
513 * プã?ルに戻しますã?
514 *
515 * @og.rev 3.3.3.3 (2003/08/06) コネクションに対して、setTransactionIsolation をã?設定しておくã€?
516 * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベã?ス名ã?ドライバ名æƒ??を追åŠ?�™るã?
517 * @og.rev 3.5.6.0 (2004/06/18) synchronized を解除しますã?
518 * @og.rev 3.8.8.2 (2007/01/26) useAppInfo を設定しますã?
519 * @og.rev 4.0.0.0 (2007/10/30) 保持æƒ??オブジェクト化に伴ã�?¤‰更
520 * @og.rev 5.1.2.0 (2010/01/01) MySQL対å¿?明示çš?�«、TRANSACTION_READ_COMMITTED を指定するã?
521 * @og.rev 5.5.2.0 (2012/05/01) properties対å¿?
522 *
523 * @return コネクションオブジェクãƒ?
524 */
525 protected Connection createInstance() {
526 Connection conn = null;
527 try {
528 // DriverManager.setLogWriter( HybsSystem.out ); // ドライバã?のログ
529
530 // 5.5.2.0 (2012/05/01) propertyの追åŠ??ç�?�¨、接続ã?propertiesåŒ?
531 Properties prop = new Properties (edbid.getProps());
532 prop.put ( "user", edbid.getUser() );
533 prop.put ( "password", edbid.getPassword() );
534
535 // conn = DriverManager.getConnection( edbid.getUrl(), edbid.getUser(), edbid.getPassword() );
536 conn = DriverManager.getConnection( edbid.getUrl(), prop );
537 // conn.setReadOnly( true );
538 conn.setReadOnly( edbid.isReadonly() );
539
540 conn.setAutoCommit( false );
541 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); // 初期値
542 // ((OracleConnection)conn).setDefaultExecuteBatch(1); // 初期値
543 // ((OracleConnection)conn).setDefaultRowPrefetch(20); // 初期値
544
545 // 3.5.2.0 (2003/10/20) 接続情報に、データベã?ス名ã?ドライバ名æƒ??を追åŠ?�™るã?
546 // 4.0.0.0 (2007/10/26) 登録先をオブジェクト化
547 if( edbid.getDbProductName() == null ) {
548 DatabaseMetaData meta = conn.getMetaData();
549 edbid.setMetaDataInfo( meta );
550 }
551 return conn ;
552 }
553 catch ( SQLException ex ) {
554 String errMsg = "コネクトすることがå?来ませんã€? + CR
555 + "DBID=[" + edbid.getDbidKey() + "]" + CR
556 + ex.getMessage() + " , status=" + ex.getSQLState();
557 Closer.connClose( conn );
558 throw new RuntimeException( errMsg,ex ); // 3.5.5.4 (2004/04/15) 引数の並びé ?¤‰更
559 }
560 }
561
562 /**
563 * アクセスログ取得ã?為のDBMS_APPLICATION_INFOの使用可否を取得しまã�?初期値:true)ã€?
564 *
565 * ãƒ??タベã?スへのアクセスログ取得ã?為、エンジンで接続するコネクションにつã�?�¦
566 * DBMS_APPLICATION_INFO.SET_CLIENT_INFO と SET_MODULE を呼び出してã�?�¾すã?
567 * こã?処ç�??、ORACLEとの接続ã?み有効ですã?で、接続å?ãƒ??タベã?スã�?ORACLE 以外ã?
568 * false を返しますã?
569 * ORACLE の場合ã?、シスãƒ?ƒ リソースの USE_DB_APPLICATION_INFO 属æ?の設定å?ã‚?
570 * 返しますã?
571 * こã?設定å?の初期値は、true ですã?
572 *
573 * @og.rev 3.8.8.2 (2007/01/26) 新規追åŠ?
574 *
575 * @return true:使用する/false:使用しなã�?
576 */
577 public boolean useApplicationInfo() { return edbid.isApplicationInfo(); }
578
579 /**
580 * 接続å?のDB名を返しますã?
581 *
582 * @og.rev 4.3.7.0 (2009/06/01) 新規作æ?
583 *
584 * @return 接続å?のDBå�?
585 */
586 public String getDBName() {
587 return edbid.getDbProductName();
588 }
589
590 /**
591 * 接続å?のDBバã?ジョンを返しますã?
592 *
593 * @og.rev 4.3.7.0 (2009/06/01) 新規作æ?
594 *
595 * @return 接続å?のDBバã?ジョン
596 */
597 public String getDBVersion() {
598 return edbid.getDbProductVersion();
599 }
600
601 /**
602 * 接続å?の簡易なå†?ƒ¨æƒ??を返しますã?
603 *
604 * @og.rev 5.3.4.0 (2011/04/01) toString() の簡易版
605 *
606 * @return 接続å?の簡易なå†?ƒ¨æƒ??
607 */
608 public String dbidInfo() {
609 return edbid.info();
610 }
611
612 /**
613 * å†?ƒ¨状況を簡易的に表現したæ–?—å?を返しますã?
614 * DBID?�URL?�USER?�ã?ールサイズ を返しますã?
615 *
616 * @og.rev 3.5.2.0 (2003/10/20) 接続情報に、データベã?ス名ã?ドライバ名æƒ??を追åŠ?�™るã?
617 * @og.rev 3.5.6.6 (2004/08/23) 同期化方法を統ä¸?�™る為、synchronized をつけますã?(別é€?要検è¨?
618 * @og.rev 4.0.0.0 (2007/10/29) EDbidのtoStringを呼ぶように変更
619 *
620 * @return こã?オブジェクトã?ールのæ–?—å?表現
621 */
622 public String toString() {
623 StringBuilder buf = new StringBuilder();
624 buf.append( edbid.toString() );
625 buf.append( super.toString() );
626 return buf.toString();
627 }
628 }