数据库连接池Java实现小结

北方群狼

北方群狼

2016-02-19 19:02

给自己一点时间接受自己,爱自己,趁着下午茶的时间来学习图老师推荐的数据库连接池Java实现小结,过去的都会过去,迎接崭新的开始,释放更美好的自己。

  因为工作需要要使用到连接池,所以拜读了互联网上众多前辈的文章,学了不少经验,这里想做一个小结,加上自己的想法和在一起,希望能给大家一些帮助。
  目的:
  消除数据库频繁连接带来的开销和瓶颈。
  解决方案:
  不过多的限制用户的使用,既不能太多的要求用户按规定的方法得到和使用数据库连
  尽量保持用户的习惯
  目前的很多方法都是要求用户只能按规定方法使用连接,不能使用直接关闭数据连接的方法。解决办法就是使用代理类,来中间解决。可以参考http://www-900.ibm.com/developerWorks/cn/java/l-connpoolproxy/index.shtml

  
  能维护连接的正常状态
  因为针对数据库连接创建的资源,假如不能及时的释放,就会影响下一次数据连接的使用。例如在sql 2k中,一个连接不同创建多条Statement否则操作时会有数据连接占线的异常,所以必须在归还连接以后释放这些资源。

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  //判定是使用了createStatement语句 if (CREATESTATE.equals(method.getName())) { obj = method.invoke(conn, args); statRef = (Statement)obj;//记录语句 return obj; }

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  //判定是否调用了close的方法,假如调用close方法则把连接置为无用状态 if(CLOSE.equals(method.getName())) { //设置不使用标志 setIsFree(false); //检查是否有后续工作,清除该连接无用资源 if (statRef != null) statRef.close(); if (prestatRef != null) prestatRef.close(); return null; }

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  正确保护类不被违例使用
  一个考虑就是不能让用户随便使用代理类,而只能自己使用,一个就是用内部私有类,一个就是使用只有指定类才能调用的标志。我的实现就是采用后者。

   

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  /** * 创建连接的工厂,只能让工厂调用 * @param factory 要调用工厂,并且一定被正确初始化 * @param param 连接参数 * @return 连接 */ static public _Connection getConnection(ConnectionFactory factory, ConnectionParam param) { if (factory.isCreate())//判定是否正确初始化的工厂 { _Connection _conn = new _Connection(param); return _conn; } else return null; }
  提供良好的用户接口,简单实用
  使用静态方法创建工厂,然后来得到连接,使用完全和普通的Connection方法一样,没有限制。同时为了方便,设置了连接参数类和工厂参数类。

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)

  
  ConnectionParam param = new ConnectionParam(driver,url,user,passWord); ConnectionFactory cf = null;//new ConnectionFactory(param, new FactoryParam()); try{ cf = new ConnectionFactory(param,new FactoryParam()); Connection conn1 = cf.getFreeConnection(); Connection conn2 = cf.getFreeConnection(); Connection conn3 = cf.getFreeConnection(); Statement stmt = conn1.createStatement(); ResultSet rs = stmt.executeQuery("select * from requests"); if (rs.next()) { System.out.println("conn1 y"); } else { System.out.println("conn1 n"); } stmt.close(); conn1.close();

  
  为了实现连接池的正常运作,使用了单态模

  /** * 使用指定的参数创建一个连接池 */ public ConnectionFactory(ConnectionParam param, FactoryParam fparam) throws SQLException { //不答应参数为空 if ((param == null)(fparam == null)) throw new SQLException("ConnectionParam和FactoryParam不能为空"); if (m_instance == null) { synchronized(ConnectionFactory.class){ if (m_instance == null) { //new instance //参数定制 m_instance = new ConnectionFactory(); m_instance.connparam = param; m_instance.MaxConnectionCount = fparam.getMaxConn(); m_instance.MinConnectionCount = fparam.getMinConn(); m_instance.ManageType = fparam.getType(); m_instance.isflag = true; //初始化,创建MinConnectionCount个连接 System.out.println("connection factory 创建!"); try{ for (int i=0; i m_instance.MinConnectionCount; i++) { _Connection _conn = _Connection.getConnection(m_instance, m_instance.connparam); if (_conn == null) continue; System.out.println("connection创建"); m_instance.FreeConnectionPool.add(_conn);//加入空闲连接池 m_instance.current_conn_count ++; //标志是否支持事务 m_instance.supportTransaction = _conn.isSupportTransaction(); } } catch(Exception e) { e.printStackTrace(); } //根据策略判定是否需要查询 if (m_instance.ManageType != 0) { Thread t = new Thread(new FactoryMangeThread(m_instance)); t.start(); } } } } }

  连接池的治理
  

展开更多 50%)
分享

猜你喜欢

数据库连接池Java实现小结

编程语言 网络编程
数据库连接池Java实现小结

使用JAVA中的动态代理实现数据库连接池

编程语言 网络编程
使用JAVA中的动态代理实现数据库连接池

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

java配置数据库连接池的方法步骤

编程语言 网络编程
java配置数据库连接池的方法步骤

Java中数据库连接池原理机制的详细讲解

编程语言 网络编程
Java中数据库连接池原理机制的详细讲解

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Tomcat下配置MySQL数据库连接池

Web开发
Tomcat下配置MySQL数据库连接池

Weblogic8配置Oracle数据库连接池

电脑网络
Weblogic8配置Oracle数据库连接池

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

用游戏串起程序员的基本功

用游戏串起程序员的基本功

如何知道一个工作簿中有多少个工作表?

如何知道一个工作簿中有多少个工作表?
下拉加载更多内容 ↓