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 }