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    }