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.process; 017 018 import org.opengion.fukurou.util.Closer ; 019 020 import java.util.Map ; 021 import java.util.HashMap ; 022 import java.util.List ; 023 import java.util.ArrayList ; 024 import java.sql.Connection; 025 026 /** 027 * ConnDataFactory は、ConnData オブジェクトを構築する為のファクトリクラスです? 028 * 029 * Connection ??は、この ファクトリクラス でキャ?ュされ、使?わされます? 030 * ここでは、?な?、コネクションを作?しますが、最大管?と、使用期間に 031 * 関しては、?部?管?て?設定?で決定します? 032 * バッチ的に使用する場合?、ほとんど効果を発揮しません。あくまで、APサーバ?? 033 * での使用を?に、永続的に繰返し使われるケースを想定して?す? 034 * 035 * @version 4.0 036 * @author Kazuhiko Hasegawa 037 * @since JDK5.0, 038 * @deprecated 5.1.9.0 (2010/08/01) ?クラスです?org.opengion.fukurou.db.ConnectionFactory 等をご使用ください? 039 */ 040 @Deprecated public final class ConnDataFactory { 041 private static final long MAX_ALIVE_TIME = 1800000 ; // 30 ? 042 private static final int MAX_LIST_COUNT = 3 ; // キャ?ュの?数 043 044 private static final Map<Integer,List<ConnData>> connMap = new HashMap<Integer,List<ConnData>>(); 045 private static final String ORACLE_DRIVER = "oracle.jdbc.OracleDriver"; 046 047 /** リターンコー? System.getProperty("line.separator") */ 048 public static final String CR = System.getProperty("line.separator"); 049 050 static { 051 try { 052 Class.forName( ORACLE_DRIVER ); 053 } 054 catch( ClassNotFoundException ex ) { 055 String errMsg = "ドライバクラスが見つかりません?" + ORACLE_DRIVER + "]"; 056 throw new RuntimeException( errMsg,ex ); 057 } 058 } 059 060 /** 061 * 【?】コンストラクタ?private 化する事で、オブジェクト生成を出来なくします? 062 * @deprecated 5.1.9.0 (2010/08/01) ?クラスで? 063 */ 064 @Deprecated private ConnDataFactory() {} 065 066 /** 067 * 【?】ConnData オブジェクトを取得します? 068 * キャ?ュに存在する場合?、キャ?ュから、そ?な??合?、新規作?します? 069 * 070 * @param url 接続?URL 071 * @param user 接続ユーザー 072 * @param passwd パスワー? 073 * 074 * @return ConnDataオブジェク? 075 * @deprecated 5.1.9.0 (2010/08/01) ?クラスで? 076 */ 077 @Deprecated public static ConnData createConnData( final String url,final String user, final String passwd ) { 078 int uniq = ( url + "," + user + "," + passwd ).hashCode() ; 079 ConnData connData = null; 080 synchronized( connMap ) { 081 List<ConnData> list = connMap.get( uniq ); 082 if( list != null && ! list.isEmpty() ) { 083 int adrs = list.size() - 1; 084 connData = list.remove( adrs ); // ??要?取り出す? 085 } 086 } 087 088 if( connData == null ) { 089 connData = new ConnData( url,user,passwd,uniq ); 090 } 091 return connData; 092 } 093 094 /** 095 * 【?】ConnData オブジェクト?終?close)処?行います? 096 * 正常終?(isOK=true)には、commit を実行し、キャ?ュに戻します? 097 * ただし?MAX_ALIVE_TIME で?した時間以上経過した場合?? 098 * オブジェクト?破?ます? 099 * 異常終?の場?isOK=false)、rollback を実行し、オブジェクト?破?ます? 100 * 101 * @param connData オブジェク? 102 * @param isOK 正常:true/異常:false 103 * @deprecated 5.1.9.0 (2010/08/01) ?クラスで? 104 */ 105 @Deprecated public static void closeConnData( final ConnData connData,final boolean isOK ) { 106 if( connData != null ) { 107 Connection conn = connData.getConnection(); 108 if( isOK ) { 109 Closer.commit( conn ); 110 if( connData.getCreateTime() + MAX_ALIVE_TIME > System.currentTimeMillis() ) { 111 int uniq = connData.getUniq(); 112 synchronized( connMap ) { 113 List<ConnData> list = connMap.get( uniq ); 114 if( list == null ) { list = new ArrayList<ConnData>(); } 115 if( list.size() >= MAX_LIST_COUNT ) { 116 Closer.connClose( conn ); 117 } 118 else { 119 list.add( connData ); 120 connMap.put( uniq,list ); 121 } 122 } 123 } 124 else { 125 Closer.connClose( conn ); 126 } 127 } 128 else { 129 Closer.rollback( conn ); 130 Closer.connClose( conn ); 131 } 132 } 133 } 134 135 /** 136 * 【?】?部 ConnData キャ?ュを?期化します? 137 * 138 * @deprecated 5.1.9.0 (2010/08/01) ?クラスで? 139 */ 140 @Deprecated public static void clear() { 141 synchronized( connMap ) { 142 for( List<ConnData> list : connMap.values() ) { 143 for( ConnData connData : list ) { 144 Connection conn = connData.getConnection(); 145 Closer.connClose( conn ); 146 } 147 list.clear(); 148 } 149 connMap.clear(); 150 } 151 } 152 }