`
abei1
  • 浏览: 21086 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

[转帖]java数据库链接池

阅读更多

       首先说明一下,这个数据库链接池不是我写的。是我在网上找到的,由于代码并不全,因此进行了一些填充。可以正常运行了。所以贴出来希望能帮到需要的人。

       这个数据库链接池的好处在于当用户从数据库链接池中的到连接后,并不需要特殊的方法将链接关闭,直接用close方法就可以关闭了。废话少说,上代码!!!!

      再次说明一下,以下的代码是根据网上得到的部分代码填充得到的,并不代表没有错误。如果那位高手能将代码完善感激不尽。

     下面的一段代码是一些数据库的属性。

java 代码
  1. public class ConnectionParam {   
  2.   
  3.     private String driver = null;                                //数据库驱动程序   
  4.     private String host = null;                                        //数据连接的URL   
  5.     private String user = null;                                        //数据库用户名   
  6.     private String password = null;                                //数据库密码   
  7.     private String dataBase= null;   
  8.     private String url = null;   
  9.     private int minConnection = 0;                //初始化连接数   
  10.     private int maxConnection = 0;                //最大连接数   
  11.     private long timeoutValue = 0;            //连接的最大空闲时间   
  12.     private long waitTime = 0;                //取连接的时候如果没有可用连接最大的等待时间   
  13.        
  14.     public ConnectionParam(){   
  15.         super();   
  16.         try {   
  17.             String tmp = null;   
  18.             int value = 0;   
  19.                                            //CommonUtil.getPropertie("");方法是自己写的一个从属性文件中读取信息的方法。   
  20.             this.driver = CommonUtil.getPropertie("driver");      
  21.             this.host = CommonUtil.getPropertie("host");                                       
  22.             this.user = CommonUtil.getPropertie("user");                                        
  23.             this.password = CommonUtil.getPropertie("password");                               
  24.             this.dataBase= CommonUtil.getPropertie("dataBase");   
  25.             this.url =CommonUtil.getPropertie("url");   
  26.                
  27.             tmp = CommonUtil.getPropertie("maxConnection");   
  28.             value = 0;   
  29.             if(CommonUtil.isNull(tmp)){   
  30.                 value = 0;   
  31.             }else{   
  32.                 value = Integer.parseInt(tmp);   
  33.             }   
  34.             this.maxConnection = value;                  
  35.                
  36.             tmp = CommonUtil.getPropertie("timeoutValue");   
  37.             value = 0;   
  38.             if(CommonUtil.isNull(tmp)){   
  39.                 value = 0;   
  40.             }else{   
  41.                 value = Integer.parseInt(tmp);   
  42.             }   
  43.             this.timeoutValue = value;               
  44.                
  45.                
  46.             tmp = CommonUtil.getPropertie("waitTime");   
  47.             value = 0;   
  48.             if(CommonUtil.isNull(tmp)){   
  49.                 value = 0;   
  50.             }else{   
  51.                 value = Integer.parseInt(tmp);   
  52.             }   
  53.             this.waitTime = value;          
  54.         } catch (IOException e) {   
  55.             // TODO Auto-generated catch block   
  56.             e.printStackTrace();   
  57.         }                                   
  58.                      
  59.            
  60.     }   
  61. }  

    下面这段代码是实现连接池的,其中的一些方法并没有实现。请各位见谅。

java 代码
  1. import java.io.PrintWriter;   
  2. import java.sql.Connection;   
  3. import java.sql.DriverManager;   
  4. import java.sql.SQLException;   
  5. import java.util.ArrayList;   
  6. import java.util.Iterator;   
  7. import java.util.List;   
  8.   
  9. import javax.sql.DataSource;   
  10.   
  11.   
  12. public class DataSourceImpl implements DataSource {   
  13.        
  14.     private ConnectionParam connParam = null;   
  15.     private List conns = null;   
  16.        
  17.     public DataSourceImpl(ConnectionParam param){   
  18.         conns = new ArrayList();   
  19.         this.connParam = param;   
  20.     }   
  21.   
  22.     public Connection getConnection() throws SQLException {   
  23.          //首先从连接池中找出空闲的对象   
  24.         Connection conn = getFreeConnection(0);   
  25.         Connection conn2 = null;   
  26.         if(conn == null){   
  27.                 //判断是否超过最大连接数,如果超过最大连接数   
  28.                 //则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接   
  29.                 if(getConnectionCount() >= connParam.getMaxConnection())   
  30.                         conn = getFreeConnection(connParam.getWaitTime());   
  31.                 else{//没有超过连接数,重新获取一个数据库的连接   
  32.                     try {   
  33.                         Class.forName(connParam.getDriver()).newInstance();   
  34.                         conn2 = DriverManager.getConnection(connParam.getUrl(),    
  35.                                 connParam.getUser(), connParam.getPassword());   
  36.                     } catch (InstantiationException e) {   
  37.                         e.printStackTrace();   
  38.                     } catch (IllegalAccessException e) {   
  39.                         e.printStackTrace();   
  40.                     } catch (ClassNotFoundException e) {   
  41.                         e.printStackTrace();   
  42.                     }   
  43.                         //代理将要返回的连接对象   
  44.                         _Connection _conn = new _Connection(conn2,true);   
  45.                         synchronized(conns){   
  46.                                 conns.add(_conn);   
  47.                         }   
  48.                         conn = _conn.getConnection();   
  49.                 }   
  50.         }   
  51.         return conn;   
  52.     }   
  53.   
  54.     public Connection getConnection(String username, String password)   
  55.             throws SQLException {   
  56.          //首先从连接池中找出空闲的对象   
  57.         Connection conn = getFreeConnection(0);   
  58.         Connection conn2 = null;   
  59.         if(conn == null){   
  60.                 //判断是否超过最大连接数,如果超过最大连接数   
  61.                 //则等待一定时间查看是否有空闲连接,否则抛出异常告诉用户无可用连接   
  62.                 if(getConnectionCount() >= connParam.getMaxConnection())   
  63.                         conn = getFreeConnection(connParam.getWaitTime());   
  64.                 else{//没有超过连接数,重新获取一个数据库的连接   
  65.                         connParam.setUser(username);   
  66.                         connParam.setPassword(password);   
  67.                         try {   
  68.                             Class.forName(connParam.getDriver()).newInstance();   
  69.                             conn2 = DriverManager.getConnection(connParam.getUrl(),    
  70.                                     username, password);   
  71.                         } catch (InstantiationException e) {   
  72.                             // TODO Auto-generated catch block   
  73.                             e.printStackTrace();   
  74.                         } catch (IllegalAccessException e) {   
  75.                             // TODO Auto-generated catch block   
  76.                             e.printStackTrace();   
  77.                         } catch (ClassNotFoundException e) {   
  78.                             // TODO Auto-generated catch block   
  79.                             e.printStackTrace();   
  80.                         }   
  81.                            
  82.                         //代理将要返回的连接对象   
  83.                         _Connection _conn = new _Connection(conn2,true);   
  84.                         synchronized(conns){   
  85.                                 conns.add(_conn);   
  86.                         }   
  87.                         conn = _conn.getConnection();   
  88.                 }   
  89.         }   
  90.         return conn;   
  91.     }   
  92.   
  93.     public PrintWriter getLogWriter() throws SQLException {   
  94.         // TODO Auto-generated method stub   
  95.         return null;   
  96.     }   
  97.   
  98.     public int getLoginTimeout() throws SQLException {   
  99.         // TODO Auto-generated method stub   
  100.         return 0;   
  101.     }   
  102.   
  103.     public void setLogWriter(PrintWriter out) throws SQLException {   
  104.         // TODO Auto-generated method stub   
  105.   
  106.     }   
  107.   
  108.     public void setLoginTimeout(int seconds) throws SQLException {   
  109.         // TODO Auto-generated method stub   
  110.   
  111.     }   
  112.        
  113.     public void initConnection(){   
  114. //       TODO Auto-generated method stub   
  115.     }   
  116.        
  117.     public void stop(){   
  118. //       TODO Auto-generated method stub   
  119.     }   
  120.        
  121.   
  122.        
  123.        
  124.     /**  
  125.      * 从连接池中取一个空闲的连接  
  126.      * @param nTimeout        如果该参数值为0则没有连接时只是返回一个null  
  127.      * 否则的话等待nTimeout毫秒看是否还有空闲连接,如果没有抛出异常  
  128.      * @return Connection  
  129.      * @throws SQLException  
  130.      */  
  131.     protected synchronized Connection getFreeConnection(long nTimeout)    
  132.             throws SQLException   
  133.     {   
  134.             Connection conn = null;   
  135.             Iterator iter = conns.iterator();   
  136.             while(iter.hasNext()){   
  137.                     _Connection _conn = (_Connection)iter.next();   
  138.                     if(!_conn.isInUse()){   
  139.                             conn = _conn.getConnection();   
  140.                             _conn.setInUse(true);                                   
  141.                             break;   
  142.                     }   
  143.             }   
  144.             if(conn == null && nTimeout > 0){   
  145.                     //等待nTimeout毫秒以便看是否有空闲连接   
  146.                     try{   
  147.                             Thread.sleep(nTimeout);   
  148.                     }catch(Exception e){}   
  149.                     conn = getFreeConnection(0);   
  150.                     if(conn == null)   
  151.                             throw new SQLException("没有可用的数据库连接");   
  152.             }   
  153.             return conn;   
  154.     }   
  155.        
  156.     /**  
  157.      * 关闭该连接池中的所有数据库连接  
  158.      * @return int 返回被关闭连接的个数  
  159.      * @throws SQLException  
  160.      */  
  161.     public int close() throws SQLException   
  162.     {   
  163.             int cc = 0;   
  164.             SQLException excp = null;   
  165.             Iterator iter = conns.iterator();   
  166.             while(iter.hasNext()){   
  167.                     try{   
  168.                             ((_Connection)iter.next()).close();   
  169.                             cc ++;   
  170.                     }catch(Exception e){   
  171.                             if(e instanceof SQLException)   
  172.                                     excp = (SQLException)e;   
  173.                     }   
  174.             }   
  175.             if(excp != null)   
  176.                     throw excp;   
  177.             return cc;   
  178.     }   
  179.        
  180.     /**  
  181.      * 返回当前链接的个数  
  182.      * @return  
  183.      */  
  184.     private int getConnectionCount(){   
  185.            
  186.         Iterator iter = conns.iterator();   
  187.         int count = 0;   
  188.          while(iter.hasNext()){   
  189.                  _Connection _conn = (_Connection)iter.next();   
  190.                  if(_conn.isInUse()){   
  191.                    count++;   
  192.                  }   
  193.          }   
  194.         return count;   
  195.     }   
  196.   
  197.   
  198.   
  199. }  

下面的是一个代理类。用来实现直接用close关闭连接。

java 代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3. import java.lang.reflect.Proxy;   
  4. import java.sql.Connection;   
  5. import java.sql.SQLException;   
  6.   
  7.   
  8. public class _Connection implements InvocationHandler {   
  9.   
  10.      private final static String CLOSE_METHOD_NAME = "close";   
  11.      private Connection conn = null;   
  12.      //数据库的忙状态   
  13.      private boolean inUse = false;   
  14.      //用户最后一次访问该连接方法的时间   
  15.      private long lastAccessTime = System.currentTimeMillis();   
  16.         
  17.      _Connection(Connection conn, boolean inUse){   
  18.              this.conn = conn;   
  19.              this.inUse = inUse;   
  20.      }   
  21.      /**  
  22.       * Returns the conn.  
  23.       * @return Connection  
  24.       */  
  25.      public Connection getConnection() {   
  26.              //返回数据库连接conn的接管类,以便截住close方法   
  27.              Connection conn2 = (Connection)Proxy.newProxyInstance(   
  28.                      conn.getClass().getClassLoader(),   
  29.                      conn.getClass().getInterfaces(),this);   
  30.              return conn2;   
  31.      }   
  32.      /**  
  33.       * 该方法真正的关闭了数据库的连接  
  34.       * @throws SQLException  
  35.       */  
  36.      void close() throws SQLException{   
  37.              //由于类属性conn是没有被接管的连接,因此一旦调用close方法后就直接关闭连接   
  38.              conn.close();   
  39.      }   
  40.      /**  
  41.       * Returns the inUse.  
  42.       * @return boolean  
  43.       */  
  44.      public boolean isInUse() {   
  45.              return inUse;   
  46.      }   
  47.   
  48.      /**  
  49.       * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object)  
  50.       */  
  51.      public Object invoke(Object proxy, Method m, Object[] args)    
  52.              throws Throwable    
  53.      {   
  54.              Object obj = null;   
  55.              //判断是否调用了close的方法,如果调用close方法则把连接置为无用状态   
  56.              if(CLOSE_METHOD_NAME.equals(m.getName()))   
  57.                      setInUse(false);                   
  58.              else  
  59.                      obj = m.invoke(conn, args);           
  60.              //设置最后一次访问时间,以便及时清除超时的连接   
  61.              lastAccessTime = System.currentTimeMillis();   
  62.              return obj;   
  63.      }   
  64.                 
  65.      /**  
  66.       * Returns the lastAccessTime.  
  67.       * @return long  
  68.       */  
  69.      public long getLastAccessTime() {   
  70.              return lastAccessTime;   
  71.      }   
  72.   
  73.      /**  
  74.       * Sets the inUse.  
  75.       * @param inUse The inUse to set  
  76.       */  
  77.      public void setInUse(boolean inUse) {   
  78.    &
分享到:
评论

相关推荐

    转帖经典---JAVA设计模式

    《转帖经典---JAVA设计模式》这本书或资料可能涵盖了这些模式的详细解释、示例代码以及如何在实际项目中应用这些模式。通过学习和理解这些设计模式,开发者能够更好地设计和重构软件,提升代码质量。

    论坛转帖工具.rar

    1. **帖子抓取**:能够识别和提取论坛帖子的文本、图片、链接等元素。 2. **内容适应**:根据目标论坛的规则和格式调整帖子内容,比如处理代码块、签名、引用等。 3. **自动登录与发布**:允许用户输入论坛账号信息...

    贴吧转帖工具

    转帖过程中,工具通常会自动保留原帖的格式和内容完整性,包括文字、图片、链接等元素,确保转帖后的帖子与原文一致。 一键8经验签到是另一项便利的功能。在百度贴吧,签到可以获得经验值,用于提升用户等级,增加...

    UBB论坛转帖圣手.exe

    UBB论坛转帖圣手.exeUBB论坛转帖圣手.exe

    discuz X2转帖工具、采集工具

    3. 原创保护:在转帖时,可以进行必要的处理,如添加引用、链接原文,尊重原作者,避免侵犯版权。 三、使用注意事项 1. 法律合规:使用这类工具时,必须确保所发布的帖子内容合法,不侵犯他人权益,遵循网络道德...

    编辑人员转帖去水印工具

    本篇文章将详细探讨“编辑人员转帖去水印工具”,并介绍如何使用名为Teorex Inpaint的1.0.0.2版本的软件来实现这一目标。 首先,我们要理解什么是水印。水印通常是指在图像或视频中添加的半透明标记,它可以是文字...

    一键转帖功能插件 for 帝国CMS 6.0 GBK utf8 V1.0.rar

    `copyto.php`负责处理转帖请求,如获取当前文章的信息,生成适合其他平台的分享链接或代码,然后将这些信息以可复制的格式返回给用户,让用户可以轻松地将内容分享到社交媒体或其他网站。 在使用过程中,可能会遇到...

    J2ME全方位开发讲解基础汇总[转帖]

    J2ME全方位开发讲解基础汇总[转帖] 一、J2ME中需要的Java基础知识 现在有大部分人,都是从零开始学J2ME的,学习J2ME的时候,总是从Java基础开始学习,而且现在讲Java基础的书籍中都是以J2SE来讲基础,这就给学习造成...

    Html2UBBMaxcj_Softii论坛专用转帖工具

    - **人人软件站.url**:这可能是一个快捷方式,指向一个网站,用户可以通过这个链接获取更多的软件信息或者下载其他资源。 - **Html2UBB**:这可能是实际的软件执行文件或库文件,用户需要运行或解压后才能使用...

    [转帖]世界编程大赛第一名写的程序

    标题和描述中的“世界编程大赛第一名写的程序”这一知识点,实际上指向了计算机科学与编程竞赛领域的一个重要概念:即在高水平的编程比赛中,优胜者所编写的代码往往蕴含着高级算法、数据结构以及编程技巧。...

    [转帖]通过WebView获取访问网页的源代码

    这篇博客(原文链接:https://dai-lm.iteye.com/blog/1158470)讨论了如何在Android中通过WebView获取网页源代码。 【知识点一】:WebView的基本使用 1. 首先,我们需要在AndroidManifest.xml中添加Internet权限,...

    jsp论坛源码

    综上所述,"jsp论坛源码"是一个涵盖了Web开发基础、数据库操作、用户管理、论坛交互等多个核心知识点的项目,对于学习和实践Java Web开发具有很高的价值。通过分析和理解这个项目,开发者能够提升自己的JSP、SQL以及...

    转帖工具ConvertX fordiscuz7.1/7.2 修改增强版.rar

    1.修改自Convert X转帖工具 2.新增批量替换关键词(原来是单个词语替换,可以利用这个功能删除一些网站的防转帖代码) 3.批量随机新增文字(新增内容可自定义,从而实现伪原创) 4.cookie记录替换和新增关键词(避免每次...

    转帖工具插件 for PHPwind 7.5 正式版.rar

    "转帖工具插件 for PHPwind 7.5 正式版" 是专门为 PHPwind 7.5 版本设计的一个功能插件,旨在提供便捷的帖子转移功能,帮助管理员或者用户将内容从一个地方轻松移动到另一个地方,而无需直接编辑论坛的原始文件。...

    zj.rar_Java_

    【描述】中的“一位软件工程师的6年总结,值得一看,转帖”暗示了这份压缩文件可能是一位有丰富经验的Java开发者整理的个人学习和工作经验的总结。通常这样的文档会涵盖Java的基础知识、最佳实践、常见问题解决方案...

    转帖图片提取工具 v1.0.zip

    转帖图片提取工具可以对论坛图片附件信息进行清除,只保留图片代码,操作很简单,推荐有需要转帖图片工具的朋友下载 转帖图片提取工具使用方法: 将IP138上处理过的东西复制到上方的编辑框内,点击只要图片,下面...

    用MyEclipse8.0构建SSH框架(转帖)

    在IT行业中,SSH框架是Java Web开发中常用的三大框架,分别是Struts2、Spring和Hibernate。这些框架分别负责表现层、业务层和服务层的管理,提供了高效、灵活且可维护的开发模式。本文将详细解释如何使用MyEclipse...

    转帖--oracle分析函数+PLSQL小结

    Oracle分析函数是数据库查询中的一个强大工具,它们在处理数据集时提供了高级的聚合功能,可以对一组行进行计算,并返回单个值或一组值。分析函数与聚合函数(如SUM, AVG, COUNT等)类似,但有显著的区别:聚合函数...

    转帖性能测试.pdf

    在测试环境中,自动负载测试是一个基本的策略,通过在一台或几台PC机上模拟成百或上千的虚拟用户同时执行业务的情景,对应用程序进行测试,同时记录下每一事务处理的时间、中间件服务器峰值数据、数据库状态等。...

    一键转帖功能插件 for 帝国CMS v1.0.rar

    "一键转帖功能插件 for 帝国CMS v1.0.rar" 是一个专为帝国CMS设计的扩展工具,其主要目标是简化用户在网站上分享内容的过程,提高用户体验。这个插件允许用户轻松地将网站上的文章或信息复制并转发到其他平台,如...

Global site tag (gtag.js) - Google Analytics