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 */
016package org.opengion.fukurou.process;
017
018import org.opengion.fukurou.util.Closer ;
019
020import java.util.Map ;
021import java.util.HashMap ;
022import java.util.List ;
023import java.util.ArrayList ;
024import 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}