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 }