Connection Pool
package common;
import java.sql.*;
import java.util.*;
public class ConnectionPool implements Runnable
{
private String driver,url,userName,password;
private int maxConnections;
private boolean waitIfBusy;
private Vector availableConnections,busyConnections;
private boolean connectionPending = false;
// structure function
public ConnectionPool(String driver,String url,String userName,String password,
int initialConnections,int maxConnections,boolean waitIfBusy) throws SQLException
{
this.driver = driver;
this.url = url;
this.userName = userName;
this.password = password;
this.maxConnections = maxConnections;
this.waitIfBusy = waitIfBusy;
if (initialConnections > maxConnections)
{
initialConnections = maxConnections;
}
availableConnections = new Vector(initialConnections);
busyConnections = new Vector();
for (int i=0; i<initialConnections;i++)
{
availableConnections.addElement(MakeNewConnection());
}
}
// get connection
public synchronized Connection GetConnection() throws SQLException
{
if (!availableConnections.isEmpty())
{
Connection existingConnection = (Connection)availableConnections.lastElement();
int lastIndex = availableConnections.size() - 1;
availableConnections.removeElementAt(lastIndex);
if (existingConnection.isClosed())
{
notifyAll();
return GetConnection();
}
else
{
busyConnections.addElement(existingConnection);
return existingConnection;
}
}
else
{
if ((TotalConnections() < maxConnections) && !connectionPending)
{
MakeBackgroundConnection();
}
else if (!waitIfBusy)
{
throw new SQLException("Connection limit reached!");
}
try
{
wait();
}
catch(InterruptedException ie)
{
}
return GetConnection();
}
}
// make new connection
private Connection MakeNewConnection() throws SQLException
{
try
{
Class.forName(driver);
Connection cnn = DriverManager.getConnection(url,userName,password);
return cnn;
}
catch(ClassNotFoundException ce)
{
throw new SQLException("Can't find class for driver:" + driver);
}
}
// make background connection
private void MakeBackgroundConnection()
{
connectionPending = true;
try
{
Thread connectionThread = new Thread(this);
connectionThread.start();
}
catch(OutOfMemoryError oe)
{
}
}
// run
public void run()
{
try
{
Connection cnn = MakeNewConnection();
synchronized(this)
{
availableConnections.addElement(cnn);
connectionPending = false;
notifyAll();
}
}
catch(Exception e)
{
}
}
// free
public synchronized void Free(Connection cnn)
{
busyConnections.removeElement(cnn);
availableConnections.addElement(cnn);
notifyAll();
}
// total connections
public synchronized int TotalConnections()
{
return (availableConnections.size() + busyConnections.size());
}
// close all connections
public synchronized void CloseAllConnections()
{
CloseConnections(availableConnections);
availableConnections = new Vector();
CloseConnections(busyConnections);
busyConnections = new Vector();
}
// close connections
private void CloseConnections(Vector cnns)
{
try
{
for (int i=0;i<cnns.size();i++)
{
Connection cnn = (Connection)cnns.elementAt(i);
if (!cnn.isClosed())
{
cnn.close();
}
}
}
catch(SQLException sqle)
{
}
}
// to string
public synchronized String ToString()
{
String info = "ConnectionPool(" + url + "," + userName + ")" +
", available=" + availableConnections.size() +
", busy=" + busyConnections.size() +
", max=" + maxConnections;
return info;
}
}
与你分享。