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 * åˆæœŸåŒ–メソãƒ?ƒ‰ã§ã™ã?
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 *
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 ?¤?¢/Shell制御
434 *
435 * @version 4.0
436 * @author Kazuhiko Hasegawa
437 * @since JDK5.0,
438 */
439 class 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 }