    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}