001    //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/io/DBConnectionPool.java $
002    /*----------------    FILE HEADER  ------------------------------------------
003    
004     This file is part of deegree.
005     Copyright (C) 2001-2008 by:
006     EXSE, Department of Geography, University of Bonn
007     http://www.giub.uni-bonn.de/deegree/
008     lat/lon GmbH
009     http://www.lat-lon.de
010    
011     This library is free software; you can redistribute it and/or
012     modify it under the terms of the GNU Lesser General Public
013     License as published by the Free Software Foundation; either
014     version 2.1 of the License, or (at your option) any later version.
015    
016     This library is distributed in the hope that it will be useful,
017     but WITHOUT ANY WARRANTY; without even the implied warranty of
018     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
019     Lesser General Public License for more details.
020    
021     You should have received a copy of the GNU Lesser General Public
022     License along with this library; if not, write to the Free Software
023     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
024    
025     Contact:
026    
027     Andreas Poth
028     lat/lon GmbH
029     Aennchenstr. 19
030     53115 Bonn
031     Germany
032     E-Mail: poth@lat-lon.de
033    
034     Prof. Dr. Klaus Greve
035     Department of Geography
036     University of Bonn
037     Meckenheimer Allee 166
038     53115 Bonn
039     Germany
040     E-Mail: greve@giub.uni-bonn.de
041    
042     
043     ---------------------------------------------------------------------------*/
044    package org.deegree.io;
045    
046    import java.sql.Connection;
047    import java.util.HashMap;
048    import java.util.Map;
049    import java.util.Properties;
050    
051    /**
052     * class to manage a database connection pool. this is part of the combination of the object pool
053     * pattern an the singelton pattern.
054     * 
055     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth </a>
056     * @version 07.02.2001
057     */
058    public class DBConnectionPool {
059    
060        private static DBConnectionPool instance = null;
061    
062        private Map<String, DBPool> pools = null;
063    
064        /**
065         * Creates a new DBConnectionPool object.
066         */
067        private DBConnectionPool() {
068            pools = new HashMap<String, DBPool>();
069        }
070    
071        /**
072         * realize singelton pattern using double checked locking pattern.
073         * 
074         * @return an instance of the data base pool. it is gauranteed that there exists only one
075         *         instance of pool for each submitted class name.
076         * 
077         */
078        public static DBConnectionPool getInstance() {
079            if ( instance == null ) {
080                synchronized ( DBConnectionPool.class ) {
081                    if ( instance == null ) {
082                        instance = new DBConnectionPool();
083                    }
084                }
085            }
086    
087            return instance;
088        }
089    
090        /**
091         * @param driver
092         *            driver to look for
093         * @param database
094         *            the database to open
095         * @param user
096         *            the username
097         * @param password
098         *            the password.
099         * @return get a Connection from the Connection pool
100         * @throws DBPoolException
101         */
102        public synchronized Connection acquireConnection( final String driver, final String database, final String user,
103                                                          final String password )
104                                throws DBPoolException {
105            String q = driver + database + user + password;
106            DBPool pool = null;
107            if ( pools.get( q ) == null ) {
108                pool = new DBPool( driver, database, user, password );
109                pools.put( q, pool );
110            } else {
111                pool = pools.get( q );
112            }
113            return (Connection) pool.acquireObject();
114        }
115    
116        /**
117         * @param driver
118         *            driver to look for
119         * @param database
120         *            the database to open
121         * @param properties
122         *            the properties of the database
123         * @return get a Connection from the Connection pool
124         * @throws DBPoolException
125         */
126        public synchronized Connection acquireConnection( final String driver, final String database,
127                                                          final Properties properties )
128                                throws DBPoolException {
129            String q = driver + database + properties.toString();
130    
131            if ( pools.get( q ) == null ) {
132                DBPool pool = new DBPool( driver, database, properties );
133                pools.put( q, pool );
134                return (Connection) pool.acquireObject();
135            }
136            DBPool pool = pools.get( q );
137            return (Connection) pool.acquireObject();
138        }
139    
140        /**
141         * releases a connection back to the pool
142         * 
143         * @param con
144         *            connections to be released
145         * @param driver
146         *            driver to look for
147         * @param database
148         *            the database to open
149         * @param user
150         *            the username
151         * @param password
152         *            the password.
153         * @throws DBPoolException
154         */
155        public synchronized void releaseConnection( final Connection con, final String driver, final String database,
156                                                    final String user, final String password )
157                                throws DBPoolException {
158            String q = driver + database + user + password;
159            DBPool pool = pools.get( q );
160            try {
161                pool.releaseObject( con );
162            } catch ( Exception e ) {
163                throw new DBPoolException( "could not release connection", e );
164            }
165        }
166    
167        /**
168         * releases a connection back to the pool
169         * 
170         * @param con
171         *            connections to be released
172         * @param driver
173         *            driver to look for
174         * @param database
175         *            the database to open
176         * @param properties
177         *            containing username and password.
178         * @throws Exception
179         */
180        public synchronized void releaseConnection( final Connection con, final String driver, final String database,
181                                                    final Properties properties )
182                                throws Exception {
183            String q = driver + database + properties.toString();
184            DBPool pool = pools.get( q );
185            pool.releaseObject( con );
186        }
187    }