「探佚」的轨迹
BlogJava
首页
新随笔
联系
聚合
管理
文章分类
.NET技术
(rss)
CSS/JavaScript/AJAX (8)
(rss)
Java EE技术 (6)
(rss)
Java ME技术
(rss)
文章档案
2008年4月 (1)
2008年3月 (1)
2008年1月 (3)
2007年12月 (9)
最新随笔
1. DWR入门
2. 数据连接池原理演示
3. JSON简介
4. offsetParent解释
5. DHTML 各种 HTML 对象常用属性
6. 检测浏览器和操作系统
7. IE中事件对象event操作
8. DOM中表格的操作
9. Log4j的使用
10. 数据连接池的配置
最新评论
1. re: Struts中防止表单重复提交
fas
--ss
2. re: Struts中防止表单重复提交
fsgfd
--ss
3. re: JSON简介
学习,再学习。你25号回家?一路顺风啊!,顺便就是给你2个Blog提个建议,老大,弄个留言板吧...来了想给你留个言都没地...速度整...
--蘇哥拉笛
数据连接池原理演示
Posted on 2008-03-10 20:02
探佚
阅读(319)
评论(0)
编辑
收藏
所属分类:
Java EE技术
多种原因使我很久没有写博客了,今天下午写了一个简单的ConnectionPool,
参考了<<深入浅出Hibernate>>。具体实现如下:
一、使用了连接池的DBManager
思路:
Connection 保存在Vector中,当前连接数小于最大连接数的时候,DBManger可以创
建新的连接,当连接数达到最大连接数时,不允许再创建新的连接,这样就很
好的限制了客户端的 连接量。 而客户端关闭连接时,首先判断当前连接数是
否连接池允许的范围类,若是则将当连接前放回到连接池中,而非真正关闭连
接,这样就实现了连接的重用,提高了访问效率。
public
class
DBManager
{
//
连接池
private
static
Vector
<
Connection
>
connPool;
//
最大连接数
private
static
final
int
MAXCONNECTIONCOUNT
=
2
;
//
数据库连接属性
public
String driverClassName
=
"
oracle.jdbc.driver.OracleDriver
"
;
public
String url
=
"
jdbc:oracle:thin:@localhost:1521:oracle
"
;
public
String userName
=
"
stephen
"
;
public
String password
=
"
stephen
"
;
public
DBManager()
{
connPool
=
new
Vector
<
Connection
>
();
}
/** */
/**
*
* 获取一个数据库连接
*
*
@return
Connection
*
*/
public
synchronized
Connection getConnection()
{
Connection conn
=
null
;
if
(connPool.isEmpty()
||
connPool.size()
<
DBManager.MAXCONNECTIONCOUNT)
{
conn
=
this
.createConnection();
}
else
{
int
lastIndex
=
connPool.size()
-
1
;
conn
=
connPool.get(lastIndex);
connPool.remove(lastIndex);
}
return
conn;
}
/** */
/**
*
* 释放数据库连接
*
*/
public
synchronized
void
releaseConnection(Connection conn)
{
if
(connPool.size()
==
DBManager.MAXCONNECTIONCOUNT)
{
try
{
conn.close();
}
catch
(SQLException e)
{
e.printStackTrace();
}
}
else
{
connPool.add(conn);
}
System.out.println(
"
连接池中连接数为:
"
+
connPool.size());
}
/** */
/**
*
* 创建一个数据库连接
*
*
@return
Connection
*
*/
private
Connection createConnection()
{
Connection conn
=
null
;
try
{
Class.forName(
this
.driverClassName);
conn
=
DriverManager.getConnection(url, userName, password);
connPool.add(conn);
}
catch
(ClassNotFoundException e)
{
e.printStackTrace();
}
catch
(SQLException e)
{
e.printStackTrace();
}
return
conn;
}
}
二、测试连接池
模拟三个客户端访问数据库,必须使客户端同时获取连接才能达到测试目的,
因此在客户端的连接中使用了休眠当前线程,从而是连接不释放,达到同步
效果。
由于连接池允许的最大连接数我设置为2,因此我新建三个客户端同时访问。
客户端一:
public
class
Client1
{
public
static
void
main(String[] args)
{
DBManager dbm
=
new
DBManager();
Connection conn
=
null
;
try
{
conn
=
dbm.getConnection();
Statement st
=
conn.createStatement();
ResultSet rs
=
st.executeQuery(
"
SELECT count(*) FROM \
"
jobs\
""
);
if
(rs.next())
{
System.out.println(
"
客户端1连接数据库,需要15S
.
"
);
Thread.currentThread().sleep(
15000
);
System.out.println(
"
查询结束\n
"
);
}
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
catch
(SQLException e)
{
e.printStackTrace();
}
finally
{
dbm.releaseConnection(conn);
}
}
}
客户端二:
public
class
Client2
{
public
static
void
main(String[] args)
{
DBManager dbm
=
new
DBManager();
Connection conn
=
null
;
//
Client 2
try
{
conn
=
dbm.getConnection();
Statement st
=
conn.createStatement();
ResultSet rs
=
st.executeQuery(
"
SELECT * FROM \
"
jobs\
""
);
if
(rs.next())
{
System.out.println(
"
客户端2连接数据库,需要10S
.
"
);
Thread.currentThread().sleep(
10000
);
System.out.println(
"
查询结束
"
);
}
}
catch
(InterruptedException e)
{
e.printStackTrace();
}
catch
(SQLException e)
{
e.printStackTrace();
}
finally
{
dbm.releaseConnection(conn);
}
}
}
客户端三:
public
class
Client3
{
/** */
/**
*
@param
args
*/
public
static
void
main(String[] args)
{
DBManager dbm
=
new
DBManager();
Connection conn
=
null
;
//
Client 3
try
{
conn
=
dbm.getConnection();
Statement st
=
conn.createStatement();
ResultSet rs
=
st.executeQuery(
"
SELECT * FROM \
"
jobs\
""
);
if
(rs.next())
{
System.out.println(
"
客户端3连接数据库
"
);
System.out.println(
"
查询结束
"
);
}
}
catch
(SQLException e)
{
e.printStackTrace();
}
finally
{
dbm.releaseConnection(conn);
}
}
}
客户端一、二能够正常访问服务器。由于连接池最大连接数是2,所以客户端三访问服务器将出错!测试成功....呵
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
Chat2DB
C++博客
博问
管理
相关文章:
数据连接池原理演示
Log4j的使用
数据连接池的配置
Struts中DispatchAction示例
Struts的国际化处理流程
Struts中防止表单重复提交
关于自己
综合博客
朋友
凯迪
评论排行榜
阅读排行榜
Copyright © 探佚