- 论坛徽章:
- 0
|
桥西居
水底沙
原创 - 17,翻译 - 0,转载 - 3, 点击 - 13133, 评论 - 33, trackbacks - 2
导航
文章
Eclipse开发
(RSS)
Struts
(RSS)
读书有感
(RSS)
精华文章
(RSS)
人生规划
(RSS)
收藏
Eclipse技术网站
相册
存档
2006年03月(10)
2006年02月(2)
2006年01月(3)
2005年12月(3)
2005年05月(2)
最近评论
wa:
但愿我能找到一份工作!
谢谢您!
lz:
客户端循环语句里面的变量我用太多local的了,把那些改为field速度会快点,但由于这是基于dos的,客户端的输入是用到system.in,当然这是阻塞,所以会运行那么慢,有兴趣的话,可以优化它,然后贴上你的代码,互相学习
cao:
你丫的就放你屁吧
Lingo:
cpu占用一直在100%
chenyi1976:
4级第一次59分,受刺激以后,第二次考了近80分;
6级又考了59分,连考3次也没有过。
现在工作6年了。发现英语真重要啊。最近在啃一本英语小说。585页。啃到300页。结果翻翻前面的单词,发现很多还是不认识。
人比人,气死人啊,只要努力了,不用太在乎结果。
Java的JDBC数据库连接池实现方法
关键字:Java,JDBC,ConnectionPool,Database,数据库连接池,sourcecode
虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库连接池,不过对于开发一般的JavaApplication、Applet或者JSP、velocity时,我们可用的JDBC数据库连接池并不多,并且一般性能都不好。Java程序员都很羡慕WindowsADO,只需要newConnection就可以直接从数据库连接池中返回Connection。并且ADOConnection是线程安全的,多个线程可以共用一个Connection,所以ASP程序一般都把getConnection放在Global.asa文件中,在IIS启动时建立数据库连接。ADO的Connection和Result都有很好的缓冲,并且很容易使用。
其实我们可以自己写一个JDBC数据库连接池。写JDBCconnectionpool的注意事项有:
1.有一个简单的函数从连接池中得到一个Connection。
2.close函数必须将connection放回数据库连接池。
3.当数据库连接池中没有空闲的connection,数据库连接池必须能够自动增加connection个数。
4.当数据库连接池中的connection个数在某一个特别的时间变得很大,但是以后很长时间只用其中一小部分,应该可以自动将多余的connection关闭掉。
5.如果可能,应该提供debug信息报告没有关闭的newConnection。
如果要newConnection就可以直接从数据库连接池中返回Connection,可以这样写(Mediatorpattern)(以下代码中使用了中文全角空格):
publicclassEasyConnectionimplementsjava.sql.Connection{
privateConnectionm_delegate=null;
publicEasyConnection(){
m_delegate=getConnectionFromPool();
}
publicvoidclose(){
putConnectionBackToPool(m_delegate);
}
publicPreparedStatementprepareStatement(Stringsql)throwsSQLException{
m_delegate.prepareStatement(sql);
}
//......othermethod
}
看来并不难。不过不建议这种写法,因为应该尽量避免使用JavaInterface,关于JavaInterface的缺点我另外再写文章讨论。大家关注的是ConnectionPool的实现方法。下面给出一种实现方法。
importjava.sql.*;
importjava.lang.reflect.*;
importjava.util.*;
importjava.io.*;
publicclassSimpleConnetionPool{
privatestaticLinkedListm_notUsedConnection=newLinkedList();
privatestaticHashSetm_usedUsedConnection=newHashSet();
privatestaticStringm_url="";
privatestaticStringm_user="";
privatestaticStringm_password="";
staticfinalbooleanDEBUG=true;
staticprivatelongm_lastClearClosedConnection=System.currentTimeMillis();
publicstaticlongCHECK_CLOSED_CONNECTION_TIME=4*60*60*1000;//4hours
static{
initDriver();
}
privateSimpleConnetionPool(){
}
privatestaticvoidinitDriver(){
Driverdriver=null;
//loadmysqldriver
try{
driver=(Driver)Class.forName("com.mysql.jdbc.Driver").newInstance();
installDriver(driver);
}catch(Exceptione){
}
//loadpostgresqldriver
try{
driver=(Driver)Class.forName("org.postgresql.Driver").newInstance();
installDriver(driver);
}catch(Exceptione){
}
}
publicstaticvoidinstallDriver(Driverdriver){
try{
DriverManager.registerDriver(driver);
}catch(Exceptione){
e.printStackTrace();
}
}
publicstaticsynchronizedConnectiongetConnection(){
clearClosedConnection();
while(m_notUsedConnection.size()>0){
try{
ConnectionWrapperwrapper=(ConnectionWrapper)m_notUsedConnection.removeFirst();
if(wrapper.connection.isClosed()){
continue;
}
m_usedUsedConnection.add(wrapper);
if(DEBUG){
wrapper.debugInfo=newThrowable("Connectioninitialstatement");
}
returnwrapper.connection;
}catch(Exceptione){
}
}
intnewCount=getIncreasingConnectionCount();
LinkedListlist=newLinkedList();
ConnectionWrapperwrapper=null;
for(inti=0;i0){
ConnectionWrapperwrapper=(ConnectionWrapper)m_notUsedConnection.removeFirst();
try{
wrapper.connection.close();
}catch(Exceptione){
}
}
}
/**
*getincreasingconnectioncount,notjustadd1connection
*@returncount
*/
publicstaticintgetIncreasingConnectionCount(){
intcount=1;
intcurrent=getConnectionCount();
count=current/4;
if(countTrackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=605741
[
点击此处收藏本文
] 发表于 2006年02月22日 2:03 PM
-->
没有评论。
发表评论
大名
请输入名字
网址
评论 请输入评论
验证码
记住我
Powered by:
Copyright © shuidisha
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15511/showart_91078.html |
|