JAVAICE
JDBC連接池
package
db;
import
java.sql.
*
;
import
java.util.Date;
public
class
connectionWithIdx
{
////
定義帶有索引的數(shù)據(jù)庫連接類
public
Connection connection;
public
int
idx;
//
定義數(shù)據(jù)庫連接的索引
public
long
startime;
//
thread flag.
public
connectionWithIdx()
{
////
初始化connectionWithIdx類
Connection connection
=
null
;
int
idx
=
0
;
//
Date dt=new Date();
//
startime=dt.getTime();
}
}
2.再定義一個(gè)數(shù)據(jù)庫連接管理類.
package
db;
import
java.sql.
*
;
public
class
dataSourceManager
{
//
public
dataSourceManager()
{
}
public
Connection getConnection()
//
{
//
DatabaseLocator.getJdbcClass();
try
{
Class.forName(DatabaseLocator.getJdbcClass());
//
String url
=
DatabaseLocator.getJdbcUrl() ;
String pwd
=
DatabaseLocator.getJdbcPwd();
String user
=
DatabaseLocator.getJdbcUser();
Connection connection
=
DriverManager.getConnection(url,user,pwd);
//
return
connection;
//
}
catch
(SQLException ex)
{
//
System.out.println(
"
\nERROR:----- SQLException -----\n
"
);
while
(ex
!=
null
)
{
System.out.println(
"
Message:
"
+
ex.getMessage());
System.out.println(
"
SQLState:
"
+
ex.getSQLState());
System.out.println(
"
ErrorCode:
"
+
ex.getErrorCode());
ex
=
ex.getNextException();
}
}
catch
(Exception ex )
{
ex.printStackTrace();
}
return
null
;
}
}
3.再定義一個(gè)主要連接類.
package
db;
import
java.sql.
*
;
import
java.util.
*
;
import
java.util.Date;
import
com.util.Reminder;
public
class
connectionPoolManager
{
private
static
connectionPoolManager instance;
//
定義服務(wù)器端連接池管理器的唯一實(shí)例
private
static
int
st
=
8
;
//
連接使用時(shí)間.
( 一個(gè)不是很恰當(dāng)?shù)姆椒?img src="http://www.aygfsteel.com/Images/dot.gif">當(dāng)遇到不可捕促的錯(cuò)誤時(shí),強(qiáng)行斷開連接.)
private
static
int
poolSize
=
DatabaseLocator.getConnpoolsize();
//
定義連接池的容量
private
Vector con_Vector;
//
定義存放數(shù)據(jù)庫連接實(shí)例的數(shù)組
public
boolean
[] inUse;
//
定義判斷數(shù)據(jù)庫連接是否可用的數(shù)組
private
boolean
closed
=
false
;
//
定義判斷連接池是否已經(jīng)銷毀的變量
//////
private
Reminder reminder;
//
定義一個(gè)計(jì)時(shí)器.
static
synchronized
public
connectionPoolManager getInstance()
{
//
返回服務(wù)器端的唯一連接池管理器實(shí)例
if
(instance
==
null
)
{
//
若服務(wù)器端存在連接池管理器實(shí)例,則返回此實(shí)例,若不存在,則創(chuàng)建后返回實(shí)例
instance
=
new
connectionPoolManager();
}
return
instance;
}
public
connectionPoolManager()
{
//
連接池管理器初始化函數(shù)
con_Vector
=
new
Vector(poolSize);
//
初始化存放數(shù)據(jù)庫連接的數(shù)組
inUse
=
new
boolean
[poolSize];
try
{
setupConnectionPool();
}
catch
(Exception ex)
{
ex.printStackTrace();
}
}
private
void
setupConnectionPool()
throws
SQLException
{
//
建立數(shù)據(jù)庫連接池函數(shù)
for
(
int
i
=
0
; i
<
poolSize; i
++
)
//
調(diào)用連接數(shù)據(jù)源管理器類向連接池中加入數(shù)據(jù)庫連接
{
Connection connection
=
new
dataSourceManager().getConnection();
con_Vector.addElement(connection);
inUse[i]
=
false
;
//
設(shè)置新加入的數(shù)據(jù)庫連接為未使用狀態(tài)
}
}
public
connectionWithIdx getConnection()
//
返回帶有索引的數(shù)據(jù)庫連接
{
if
(closed)
//
如果連接池已銷毀,則首先建立數(shù)據(jù)庫連接池
{
try
{
setupConnectionPool();
}
catch
(Exception ex)
{
ex.printStackTrace();
}
closed
=
false
;
System.out.println(
"
連接池已開放
"
);
}
connectionWithIdx con
=
null
;
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
//
搜索未使用的數(shù)據(jù)庫連接
{
if
(inUse[i]
==
false
)
//
若存在未被使用的數(shù)據(jù)庫連接,則使用此連接
{
con
=
new
connectionWithIdx();
//
建立帶有索引的數(shù)據(jù)庫連接類實(shí)例
con.connection
=
(Connection)con_Vector.elementAt(i);
//
使用未被使用的數(shù)據(jù)庫連接建立帶有索引的數(shù)據(jù)庫連接類實(shí)例
con.idx
=
i;
//
為此實(shí)例數(shù)據(jù)庫連接的索引賦值
inUse[i]
=
true
;
//
將連接池中此數(shù)據(jù)庫連接設(shè)置為已被使用狀態(tài)
//
reminder
=
new
Reminder(i ,st);
//
計(jì)時(shí)器,釋放連接
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數(shù)據(jù)庫連接
for
(
int
j
=
0
; j
<
con_Vector.size(); j
++
)
{
if
(inUse[j]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個(gè)未被使用的連接
"
);
return
con;
//
返回帶有索引的數(shù)據(jù)庫連接類實(shí)例
}
}
int
freeCon
=
0
;
//
若所有數(shù)據(jù)庫連接都處于被使用狀態(tài),則返回空值
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個(gè)未被使用的連接
"
);
return
con;
}
public
void
freeConnection(
int
connectionIdx)
//
將使用完的數(shù)據(jù)庫連接放回到連接池中
{
inUse[connectionIdx]
=
false
;
//
將連接池中此數(shù)據(jù)庫連接設(shè)置為未使用狀態(tài)
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數(shù)據(jù)庫連接
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個(gè)未被使用的連接
"
);
//
closeConnection();
//
試圖關(guān)閉連接池
}
public
void
closeConnection()
//
若沒有用戶使用此連接池中的連接,則銷毀連接池
{
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數(shù)據(jù)庫連接
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
if
(freeCon
==
poolSize)
//
若未被使用的數(shù)據(jù)庫連接等于連接池的容量,則銷毀連接池
{
try
{
for
(
int
i
=
0
; i
<
poolSize; i
++
)
{
((Connection)con_Vector.elementAt(i)).close();
inUse[i]
=
false
;
}
}
catch
(Exception ex)
{
ex.printStackTrace();
}
closed
=
true
;
System.out.println(
"
連接池已關(guān)閉
"
);
}
}
}
本人在實(shí)際項(xiàng)目中運(yùn)用過,切實(shí)可用.
發(fā)表于 2007-07-20 15:11
大頭菜
閱讀(107)
評論(0)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
<
2025年7月
>
日
一
二
三
四
五
六
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
導(dǎo)航
BlogJava
首頁
發(fā)新隨筆
發(fā)新文章
聯(lián)系
聚合
管理
統(tǒng)計(jì)
隨筆: 0
文章: 1
評論: 0
引用: 0
留言簿
給我留言
查看公開留言
查看私人留言
文章檔案
2007年7月 (1)
相冊
My
搜索
最新評論
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 大頭菜
主站蜘蛛池模板:
浦北县
|
德令哈市
|
永平县
|
汶上县
|
泌阳县
|
阳原县
|
固原市
|
荆门市
|
西乡县
|
凉城县
|
上思县
|
萍乡市
|
长兴县
|
简阳市
|
西和县
|
财经
|
开远市
|
襄城县
|
东宁县
|
田林县
|
宜都市
|
内乡县
|
卓资县
|
津市市
|
南宫市
|
炉霍县
|
鲜城
|
鄱阳县
|
怀安县
|
武平县
|
饶平县
|
文化
|
晋城
|
光泽县
|
江陵县
|
龙口市
|
蚌埠市
|
屯昌县
|
大足县
|
当阳市
|
林州市
|