📄 dbmanager.java
字号:
///////////////////////////////////////////////////////////
// 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 + -