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    }