免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1029 | 回复: 0
打印 上一主题 下一主题

Java的JDBC数据库连接池实现方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-26 14:54 |只看该作者 |倒序浏览



桥西居
水底沙
原创 - 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
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP