发新话题
打印

Connection Pool

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;
        }
}

与你分享。      
www.ltebuy.net

TOP

希望以后贴出来再向大家讲解一下      
夜黑漆漆, 有水的村庄 鸟叫不停, 浅沙下荸荠 那果实在地下长大象哑子叫门 鱼群悄悄潜行如同在一个做梦少女怀中 那时刻有位母亲昙花一现 鸟叫不定, 仿佛村子如一颗小鸟的嘴唇 鸟叫不定而小鸟没有嘴唇 你是夜晚的一部分 谁是黑夜的母亲 那夜晚在门前长大象哑子叫门 鸟叫不定象小鸟奉献给黑夜的嘴唇 在门外黑夜的嘴唇 写下了你的姓名

TOP

发新话题