⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbmanager.java

📁 网上商店
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
///////////////////////////////////////////////////////////
// DeJaved by mDeJava v1.0. Copyright 1999 MoleSoftware. //
//       To download last version of this software:      //
//            http://molesoftware.hypermatr.net          //
//               e-mail:molesoftware@mail.ru             //
///////////////////////////////////////////////////////////
/***************************************************************************
	 * 数据库连接池 *
**************************************************************************/
package cn.edu.ujn.srms.pub.conn;

import java.io.*;
import java.sql.*;
import java.util.*;
import java.util.Date;

public class DBManager
{
	//连接池成员类
	/***************************************************************************
	 * 连接池成员类 *
	 **************************************************************************/
    class DBConnectionPool
    {
    	//监视线程类
    	/***************************************************************************
    	 * 监视线程类 *
    	 **************************************************************************/
		class MonitThread extends Thread
		{
			MonitConnection conn;
			public void run()
			{
				try
				{
					while(true)
					{
						sleep(100);
						//检查监视池中有无超时连接,有则强制归还
			            Enumeration enumeration = monitConnections.elements();
			            while(enumeration.hasMoreElements())
			            {
			            	conn=(MonitConnection)enumeration.nextElement();
			            	conn.usedTime++;
			            	if(conn.usedTime>50)
			            	{
								System.out.println("Connection pool: Abnormal connection free!");
								freeConnection(conn.conn);
			            	}
			            }
					}
				}
				catch(InterruptedException ex)
				{
					System.err.println(ex);
				}
			}
		}
		
		class MonitConnection
		{
			public Connection conn;
			public int usedTime;
			
			public MonitConnection(Connection connection)
			{
				conn=connection;
				usedTime=0;
			}
		}
	
        private int checkedOut = 0;
        private Vector freeConnections = null;
        private int maxConn = 0;
        private String name = null;
        private String password = null;
        private String URL = null;
        private String user = null;
        
        private Vector monitConnections = null;
        private MonitThread monThread = null;
        
        /***************************************************************************
    	 * 释放连接 *
    	 **************************************************************************/
        public synchronized void freeConnection(Connection connection)
        {
        	//从监视池中找到该连接,并从监视池中删除
        	MonitConnection mConn;
        	Enumeration enumeration = monitConnections.elements();
			while(enumeration.hasMoreElements())
			{
				mConn=(MonitConnection)enumeration.nextElement();
				if(mConn.conn==connection)
				{
					monitConnections.removeElement(mConn);
					break;
				}
			}
        	enumeration = freeConnections.elements();
			while(enumeration.hasMoreElements())
			{
				if((Connection)enumeration.nextElement()==connection)
					return;
			}
			
            freeConnections.addElement(connection);
            checkedOut--;
            System.out.println("Connection pool: Pool Freed, Connection remain=" + checkedOut);
            notifyAll();
        }

		//从连接池中获取可用连接
        /***************************************************************************
    	 * 从连接池中获取可用连接 *
    	 **************************************************************************/
        public synchronized Connection getConnection()
        {
            Connection connection = null;
            //如果可用连接池不为空
            if(freeConnections.size() > 0)
            {
            	//抽取可用连接池的第一个元素,并将其从可用连接池中剔除
                connection = (Connection)freeConnections.firstElement();
                freeConnections.removeElementAt(0);
                try
                {
                	//如果该连接已经关闭,则重新打开
                    if(connection.isClosed())
                    {
                        log("\u4ECE\u8FDE\u63A5\u6C60" + name + "\u5220\u9664\u4E00\u4E2A\u65E0\u6548\u8FDE\u63A5");
                        connection = getConnection();
                    }
                }
                catch(SQLException sqlexception)
                {
                    log("\u4ECE\u8FDE\u63A5\u6C60" + name + "\u5220\u9664\u4E00\u4E2A\u65E0\u6548\u8FDE\u63A5");
                    connection = getConnection();
                }
            }
            //如果可用连接池为空,并且允许新连接
            else if(maxConn == 0 || checkedOut < maxConn)
                connection = newConnection();
            if(connection != null)
            {
                checkedOut++;
                //将该连接加入到监视池中
                MonitConnection mConn=new MonitConnection(connection);
                monitConnections.addElement(mConn);
            }
            System.out.println("Connection pool: DB Connections= " + DBManager.DBConnections + "  Pool Connections= " + "" + checkedOut);
            return connection;
        }

		//申请新连接,超时l毫秒后失败
        /***************************************************************************
    	 * 申请新连接,超时l毫秒后失败 *
    	 **************************************************************************/
        public synchronized Connection getConnection(long l)
        {
            long l1 = (new Date()).getTime();
            Connection connection;
            while((connection = getConnection()) == null) 
            {
                try
                {
                    wait(l);
                }
                catch(InterruptedException interruptedexception) { }
                if((new Date()).getTime() - l1 >= l)
                    return null;
            }

            return connection;
        }

		//释放可用连接池
        /***************************************************************************
    	 * 释放可用连接池 *
    	 **************************************************************************/
        public synchronized void release()
        {
            for(Enumeration enumeration = freeConnections.elements(); enumeration.hasMoreElements();)
            {
                Connection connection = (Connection)enumeration.nextElement();
                try
                {
                    connection.close();
                    log("\u5173\u95ED\u8FDE\u63A5\u6C60" + name + "\u4E2D\u7684\u4E00\u4E2A\u8FDE\u63A5");
                }
                catch(SQLException sqlexception)
                {
                    log(sqlexception, "\u65E0\u6CD5\u5173\u95ED\u8FDE\u63A5\u6C60" + name + "\u4E2D\u7684\u8FDE\u63A5");
                }
            }

            freeConnections.removeAllElements();
        }

		//申请新的数据库连接
        /***************************************************************************
    	 * 申请新的数据库连接 *
    	 **************************************************************************/
        private Connection newConnection()
        {
            Connection connection = null;
            try
            {
                if(user == null)
                    connection = DriverManager.getConnection(URL);
                else
                    connection = DriverManager.getConnection(URL, user, password);
                log("\u8FDE\u63A5\u6C60" + name + "\u521B\u5EFA\u4E00\u4E2A\u65B0\u7684\u8FDE\u63A5");
            }
            catch(SQLException sqlexception)
            {
                log(sqlexception, "\u65E0\u6CD5\u521B\u5EFA\u4E0B\u5217URL\u7684\u8FDE\u63A5: " + URL);
                return null;
            }
            if(connection == null)
                System.out.println("Null connection returned from Openbase");
            else
                DBManager.DBConnections++;
            return connection;
        }

        public DBConnectionPool(String s, String s1, String s2, String s3, int i)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -