JAVAICE
JDBC連接池
package
db;
import
java.sql.
*
;
import
java.util.Date;
public
class
connectionWithIdx
{
////
定義帶有索引的數據庫連接類
public
Connection connection;
public
int
idx;
//
定義數據庫連接的索引
public
long
startime;
//
thread flag.
public
connectionWithIdx()
{
////
初始化connectionWithIdx類
Connection connection
=
null
;
int
idx
=
0
;
//
Date dt=new Date();
//
startime=dt.getTime();
}
}
2.再定義一個數據庫連接管理類.
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.再定義一個主要連接類.
package
db;
import
java.sql.
*
;
import
java.util.
*
;
import
java.util.Date;
import
com.util.Reminder;
public
class
connectionPoolManager
{
private
static
connectionPoolManager instance;
//
定義服務器端連接池管理器的唯一實例
private
static
int
st
=
8
;
//
連接使用時間.
( 一個不是很恰當的方法
當遇到不可捕促的錯誤時,強行斷開連接.)
private
static
int
poolSize
=
DatabaseLocator.getConnpoolsize();
//
定義連接池的容量
private
Vector con_Vector;
//
定義存放數據庫連接實例的數組
public
boolean
[] inUse;
//
定義判斷數據庫連接是否可用的數組
private
boolean
closed
=
false
;
//
定義判斷連接池是否已經銷毀的變量
//////
private
Reminder reminder;
//
定義一個計時器.
static
synchronized
public
connectionPoolManager getInstance()
{
//
返回服務器端的唯一連接池管理器實例
if
(instance
==
null
)
{
//
若服務器端存在連接池管理器實例,則返回此實例,若不存在,則創建后返回實例
instance
=
new
connectionPoolManager();
}
return
instance;
}
public
connectionPoolManager()
{
//
連接池管理器初始化函數
con_Vector
=
new
Vector(poolSize);
//
初始化存放數據庫連接的數組
inUse
=
new
boolean
[poolSize];
try
{
setupConnectionPool();
}
catch
(Exception ex)
{
ex.printStackTrace();
}
}
private
void
setupConnectionPool()
throws
SQLException
{
//
建立數據庫連接池函數
for
(
int
i
=
0
; i
<
poolSize; i
++
)
//
調用連接數據源管理器類向連接池中加入數據庫連接
{
Connection connection
=
new
dataSourceManager().getConnection();
con_Vector.addElement(connection);
inUse[i]
=
false
;
//
設置新加入的數據庫連接為未使用狀態
}
}
public
connectionWithIdx getConnection()
//
返回帶有索引的數據庫連接
{
if
(closed)
//
如果連接池已銷毀,則首先建立數據庫連接池
{
try
{
setupConnectionPool();
}
catch
(Exception ex)
{
ex.printStackTrace();
}
closed
=
false
;
System.out.println(
"
連接池已開放
"
);
}
connectionWithIdx con
=
null
;
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
//
搜索未使用的數據庫連接
{
if
(inUse[i]
==
false
)
//
若存在未被使用的數據庫連接,則使用此連接
{
con
=
new
connectionWithIdx();
//
建立帶有索引的數據庫連接類實例
con.connection
=
(Connection)con_Vector.elementAt(i);
//
使用未被使用的數據庫連接建立帶有索引的數據庫連接類實例
con.idx
=
i;
//
為此實例數據庫連接的索引賦值
inUse[i]
=
true
;
//
將連接池中此數據庫連接設置為已被使用狀態
//
reminder
=
new
Reminder(i ,st);
//
計時器,釋放連接
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數據庫連接
for
(
int
j
=
0
; j
<
con_Vector.size(); j
++
)
{
if
(inUse[j]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個未被使用的連接
"
);
return
con;
//
返回帶有索引的數據庫連接類實例
}
}
int
freeCon
=
0
;
//
若所有數據庫連接都處于被使用狀態,則返回空值
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個未被使用的連接
"
);
return
con;
}
public
void
freeConnection(
int
connectionIdx)
//
將使用完的數據庫連接放回到連接池中
{
inUse[connectionIdx]
=
false
;
//
將連接池中此數據庫連接設置為未使用狀態
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數據庫連接
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
System.out.println(
"
連接池中共有
"
+
freeCon
+
"
個未被使用的連接
"
);
//
closeConnection();
//
試圖關閉連接池
}
public
void
closeConnection()
//
若沒有用戶使用此連接池中的連接,則銷毀連接池
{
int
freeCon
=
0
;
//
判斷連接池中有多少未被使用的數據庫連接
for
(
int
i
=
0
; i
<
con_Vector.size(); i
++
)
{
if
(inUse[i]
==
false
)
{
freeCon
++
;
}
}
if
(freeCon
==
poolSize)
//
若未被使用的數據庫連接等于連接池的容量,則銷毀連接池
{
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(
"
連接池已關閉
"
);
}
}
}
本人在實際項目中運用過,切實可用.
發表于 2007-07-20 15:11
大頭菜
閱讀(104)
評論(0)
編輯
收藏
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
<
2025年5月
>
日
一
二
三
四
五
六
27
28
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
導航
BlogJava
首頁
發新隨筆
發新文章
聯系
聚合
管理
統計
隨筆: 0
文章: 1
評論: 0
引用: 0
留言簿
給我留言
查看公開留言
查看私人留言
文章檔案
2007年7月 (1)
相冊
My
搜索
最新評論
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 大頭菜
主站蜘蛛池模板:
免费在线看污视频
|
91久久精品国产免费直播
|
国产亚洲色婷婷久久99精品
|
精品在线免费观看
|
久久乐国产综合亚洲精品
|
亚洲av无码成人精品区
|
99精品国产成人a∨免费看
|
亚洲精品成a人在线观看☆
|
亚洲精品高清无码视频
|
成人无遮挡毛片免费看
|
精品一区二区三区免费观看
|
亚洲一卡二卡三卡
|
中文亚洲AV片在线观看不卡
|
毛片免费全部免费观看
|
a毛片在线免费观看
|
亚洲av色香蕉一区二区三区
|
黄色网址免费在线观看
|
亚洲最大黄色网址
|
亚洲无码视频在线
|
国产成人免费高清激情视频
|
成全动漫视频在线观看免费高清版下载
|
a国产成人免费视频
|
亚洲日韩AV一区二区三区四区
|
亚洲中文字幕无码一区
|
最近免费中文字幕4
|
免费国产在线视频
|
一级女性全黄久久生活片免费
|
亚洲人成影院在线高清
|
国产亚洲精品国看不卡
|
美女黄网站人色视频免费国产
|
无码国产精品一区二区免费式芒果
|
国产亚洲欧美日韩亚洲中文色
|
日韩精品无码免费专区午夜不卡
|
亚洲精品无码专区在线
|
亚洲欧洲日产国码www
|
亚洲午夜久久久久妓女影院
|
一个人免费观看视频www
|
国产精品区免费视频
|
国产精品美女免费视频观看
|
综合一区自拍亚洲综合图区
|
亚洲一区在线视频观看
|