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 }