001: /*
002: * ====================================================================
003: *
004: * XFLOW - Process Management System
005: * Copyright (C) 2003 Rob Tan
006: * All rights reserved.
007: *
008: * Redistribution and use in source and binary forms, with or without
009: * modification, are permitted provided that the following conditions
010: * are met:
011: *
012: * 1. Redistributions of source code must retain the above copyright
013: * notice, this list of conditions, and the following disclaimer.
014: *
015: * 2. Redistributions in binary form must reproduce the above copyright
016: * notice, this list of conditions, and the disclaimer that follows
017: * these conditions in the documentation and/or other materials
018: * provided with the distribution.
019: *
020: * 3. The name "XFlow" must not be used to endorse or promote products
021: * derived from this software without prior written permission. For
022: * written permission, please contact rcktan@yahoo.com
023: *
024: * 4. Products derived from this software may not be called "XFlow", nor
025: * may "XFlow" appear in their name, without prior written permission
026: * from the XFlow Project Management (rcktan@yahoo.com)
027: *
028: * In addition, we request (but do not require) that you include in the
029: * end-user documentation provided with the redistribution and/or in the
030: * software itself an acknowledgement equivalent to the following:
031: * "This product includes software developed by the
032: * XFlow Project (http://xflow.sourceforge.net/)."
033: * Alternatively, the acknowledgment may be graphical using the logos
034: * available at http://xflow.sourceforge.net/
035: *
036: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
037: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
038: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
039: * DISCLAIMED. IN NO EVENT SHALL THE XFLOW AUTHORS OR THE PROJECT
040: * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
041: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
042: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
043: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
044: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
045: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
046: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
047: * SUCH DAMAGE.
048: *
049: * ====================================================================
050: * This software consists of voluntary contributions made by many
051: * individuals on behalf of the XFlow Project and was originally
052: * created by Rob Tan (rcktan@yahoo.com)
053: * For more information on the XFlow Project, please see:
054: * <http://xflow.sourceforge.net/>.
055: * ====================================================================
056: */
057:
058: package xflow.util;
059:
060: import java.sql.*;
061: import java.util.*;
062:
063: public class ConnectionPool {
064:
065: private Hashtable connections;
066: private int increment = 3;
067: private int initialConnections = 3;
068: private String dbURL, user, password;
069:
070: public ConnectionPool(String driver, String user, String password,
071: String dbURL) throws SQLException {
072:
073: this .dbURL = dbURL;
074: this .user = user;
075: this .password = password;
076:
077: connections = new Hashtable();
078:
079: System.out.println("JDBC Driver: " + driver);
080: try {
081: Class.forName(driver).newInstance();
082: } catch (Exception e) {
083: e.printStackTrace();
084: }
085:
086: System.out.println("DB URL: " + dbURL);
087: // Put our pool connections in hash table
088: for (int i = 0; i < initialConnections; i++) {
089:
090: connections.put(DriverManager.getConnection(dbURL, user,
091: password), Boolean.FALSE);
092: }
093: }
094:
095: public Connection getConnection() throws SQLException {
096:
097: Connection con = null;
098: Enumeration cons = connections.keys();
099:
100: synchronized (connections) {
101: while (cons.hasMoreElements()) {
102: con = (Connection) cons.nextElement();
103:
104: Boolean b = (Boolean) connections.get(con);
105: if (b == Boolean.FALSE) {
106: try {
107: con.setAutoCommit(false);
108: } catch (SQLException e) {
109: con = DriverManager.getConnection(dbURL, user,
110: password);
111: }
112:
113: // Update hash table to show this one is taken
114: connections.put(con, Boolean.TRUE);
115:
116: return con;
117: }
118: }
119: }
120:
121: // If we got here, there are no more free connections, go get some more
122: for (int i = 0; i < increment; i++) {
123: try {
124: Connection c = DriverManager.getConnection(dbURL, user,
125: password);
126: connections.put(c, Boolean.FALSE);
127: } catch (Exception e) {
128: System.err.println("getConnection FAILED");
129: }
130:
131: }
132:
133: // Recurse to get one of the new connections
134: return getConnection();
135: }
136:
137: public void returnConnection(Connection returned) {
138: Connection con;
139: Enumeration cons = connections.keys();
140: while (cons.hasMoreElements()) {
141: con = (Connection) cons.nextElement();
142: if (con == returned) {
143: connections.put(con, Boolean.FALSE);
144: break;
145: }
146: }
147: }
148: }
|