阿
阿魁
Unregistered / Unconfirmed
GUEST, unregistred user!
这是我自己参考资料,写的数据库连接池,运行环境如下:
windows 2000 advanced server + sp4
sql server 2000 Ent. + sp3
j2se 1.4.1
JDBC for sql server 2000 Version 2.2.0029 Service Pack 1
系统启动后,在sql server 企业管理器中查看进程信息时,发现由此连接池创建的一些连接的上次使用时间是1900年1月1日,从CPU时间来看,这些连接根本没有使用过。
连接池类完整源代码如下:
============================================================================
package smapp;
import java.sql.*;
import java.util.*;
import java.io.*;
/**
* <p>Title: SmApp By Arky</p>
* <p>Description: 数据库连接池</p>
* <p>Copyright: Copyright (c) 2003 Arky</p>
* <p>Company: </p>
* @author Arky
* @version 1.0
*/
public class ConnectionPool
{
private static ConnectionPool db_pool=null;
private MessageLog log;
private LinkedList pool;
//保存空闲的连接
private int checked;
//已被使用的连接数
//数据库配置信息
private String drv;
//数据库驱动
private String url;
//数据库连接URL
private int pool_init_size;
//连接池初始大小
private int pool_max_size;
//连接池大小上限
//获取系统唯一 ConnectionPool 的方法
public static synchronized ConnectionPool getInstance()
{
if (db_pool == null)
db_pool = new ConnectionPool();
return db_pool;
}
//私有化构造函数,防止使用NEW创建对象
private ConnectionPool()
{
log = MessageLog.getInstance();
//取得DB配置信息
Properties p = new Properties();
try
{
p.load(new FileInputStream("config/db.properties"));
drv = p.getProperty("driver");
url = p.getProperty("url");
pool_init_size = Integer.parseInt(p.getProperty("pool_init_size"));
pool_max_size = Integer.parseInt(p.getProperty("pool_max_size"));
p = null;
}
catch(Exception e)
{
log.printEvent("DB get properties error:" + e);
System.exit(1);
}
//初始化连接池
init();
}
//初始化连接池
private void init()
{
pool = new LinkedList();
checked = 0;
Connection conn = null;
//注册JDBC DRIVER
try
{
Driver d = (Driver) Class.forName(drv).newInstance();
DriverManager.registerDriver(d);
}
catch(Exception e)
{
log.printEvent("DB register JDBC DRIVER error:" + e);
System.exit(1);
}
log.printEvent("DB register JDBC DRIVER successfully");
//创建 pool_init_size 个连接
log.printEvent("DB init " + pool_init_size + " SqlConnection(s)...");
try
{
for (int i=0;i<pool_init_size;i++)
{
conn = DriverManager.getConnection(url);
pool.addLast(conn);
}
}
catch(Exception e)
{
log.printEvent("DB init SqlConnection error:" + e);
System.exit(1);
}
}
//从连接池中获取一个连接
public synchronized Connection getConnection()
{
Connection conn=null;
Statement st=null;
if (pool.size()>0)
{
//连接池中还有空闲连接,获取一个
conn = (Connection) pool.getFirst();
pool.removeFirst();
try
{
if (conn == null || conn.isClosed()) //连接已无效,迭代获取连接
{
conn = getConnection();
}
else
{
//测试这个连接是否可用
st = conn.createStatement();
st.close();
}
}
catch(Exception e)
{
//如果有错误,可能是无效连接
log.printEvent("DB ConnectionPool delete an invalid connection");
//关于语句和连接
if (st!=null)
{
try
{
st.close();
conn.close();
}catch(Exception ex){}
}
conn = getConnection();
}
}
else
//没有空闲的连接,创建一个新的连接
{
try {
conn = DriverManager.getConnection(url);
}
catch (Exception e) {
log.printEvent("DB get connection error:" + e);
conn = null;
}
}
checked++;
//增加使用计数
return conn;
}
//归还连接到池
public synchronized void freeConnection(Connection conn)
{
checked--;
//减小使用计数
//是否放回到连接池中?
if ((pool.size() + checked) >= pool_max_size)
{
//关闭连接
try
{
conn.close();
conn=null;
}catch(Exception e){}
return;
}
//如果连接有效,放回连接池
Statement st = null;
try
{
if (conn==null || conn.isClosed()) return;
st=conn.createStatement();
st.close();
}
catch(Exception e)
{
if (st!=null)
{
try
{
st.close();
conn.close();
}catch(Exception ex){}
}
return;
}
//将连接放回到连接池中
pool.addLast(conn);
}
}
db.properties格式如下:
===============================================
driver=数据库驱动类
url=数据库连接字符串
pool_init_size=5 #连接池初始大小
pool_max_size=20 #最多连接数(空闲+已使用)
因为这个类已经在我的系统里大量使用,所以不想改用其他调用接口的连接池类,请各位帮忙看看问题出在哪里,非常感谢。
windows 2000 advanced server + sp4
sql server 2000 Ent. + sp3
j2se 1.4.1
JDBC for sql server 2000 Version 2.2.0029 Service Pack 1
系统启动后,在sql server 企业管理器中查看进程信息时,发现由此连接池创建的一些连接的上次使用时间是1900年1月1日,从CPU时间来看,这些连接根本没有使用过。
连接池类完整源代码如下:
============================================================================
package smapp;
import java.sql.*;
import java.util.*;
import java.io.*;
/**
* <p>Title: SmApp By Arky</p>
* <p>Description: 数据库连接池</p>
* <p>Copyright: Copyright (c) 2003 Arky</p>
* <p>Company: </p>
* @author Arky
* @version 1.0
*/
public class ConnectionPool
{
private static ConnectionPool db_pool=null;
private MessageLog log;
private LinkedList pool;
//保存空闲的连接
private int checked;
//已被使用的连接数
//数据库配置信息
private String drv;
//数据库驱动
private String url;
//数据库连接URL
private int pool_init_size;
//连接池初始大小
private int pool_max_size;
//连接池大小上限
//获取系统唯一 ConnectionPool 的方法
public static synchronized ConnectionPool getInstance()
{
if (db_pool == null)
db_pool = new ConnectionPool();
return db_pool;
}
//私有化构造函数,防止使用NEW创建对象
private ConnectionPool()
{
log = MessageLog.getInstance();
//取得DB配置信息
Properties p = new Properties();
try
{
p.load(new FileInputStream("config/db.properties"));
drv = p.getProperty("driver");
url = p.getProperty("url");
pool_init_size = Integer.parseInt(p.getProperty("pool_init_size"));
pool_max_size = Integer.parseInt(p.getProperty("pool_max_size"));
p = null;
}
catch(Exception e)
{
log.printEvent("DB get properties error:" + e);
System.exit(1);
}
//初始化连接池
init();
}
//初始化连接池
private void init()
{
pool = new LinkedList();
checked = 0;
Connection conn = null;
//注册JDBC DRIVER
try
{
Driver d = (Driver) Class.forName(drv).newInstance();
DriverManager.registerDriver(d);
}
catch(Exception e)
{
log.printEvent("DB register JDBC DRIVER error:" + e);
System.exit(1);
}
log.printEvent("DB register JDBC DRIVER successfully");
//创建 pool_init_size 个连接
log.printEvent("DB init " + pool_init_size + " SqlConnection(s)...");
try
{
for (int i=0;i<pool_init_size;i++)
{
conn = DriverManager.getConnection(url);
pool.addLast(conn);
}
}
catch(Exception e)
{
log.printEvent("DB init SqlConnection error:" + e);
System.exit(1);
}
}
//从连接池中获取一个连接
public synchronized Connection getConnection()
{
Connection conn=null;
Statement st=null;
if (pool.size()>0)
{
//连接池中还有空闲连接,获取一个
conn = (Connection) pool.getFirst();
pool.removeFirst();
try
{
if (conn == null || conn.isClosed()) //连接已无效,迭代获取连接
{
conn = getConnection();
}
else
{
//测试这个连接是否可用
st = conn.createStatement();
st.close();
}
}
catch(Exception e)
{
//如果有错误,可能是无效连接
log.printEvent("DB ConnectionPool delete an invalid connection");
//关于语句和连接
if (st!=null)
{
try
{
st.close();
conn.close();
}catch(Exception ex){}
}
conn = getConnection();
}
}
else
//没有空闲的连接,创建一个新的连接
{
try {
conn = DriverManager.getConnection(url);
}
catch (Exception e) {
log.printEvent("DB get connection error:" + e);
conn = null;
}
}
checked++;
//增加使用计数
return conn;
}
//归还连接到池
public synchronized void freeConnection(Connection conn)
{
checked--;
//减小使用计数
//是否放回到连接池中?
if ((pool.size() + checked) >= pool_max_size)
{
//关闭连接
try
{
conn.close();
conn=null;
}catch(Exception e){}
return;
}
//如果连接有效,放回连接池
Statement st = null;
try
{
if (conn==null || conn.isClosed()) return;
st=conn.createStatement();
st.close();
}
catch(Exception e)
{
if (st!=null)
{
try
{
st.close();
conn.close();
}catch(Exception ex){}
}
return;
}
//将连接放回到连接池中
pool.addLast(conn);
}
}
db.properties格式如下:
===============================================
driver=数据库驱动类
url=数据库连接字符串
pool_init_size=5 #连接池初始大小
pool_max_size=20 #最多连接数(空闲+已使用)
因为这个类已经在我的系统里大量使用,所以不想改用其他调用接口的连接池类,请各位帮忙看看问题出在哪里,非常感谢。