Java基礎一種實現數據庫連接池的方法1

2019年06月04日 来源:
夜尿增多的表现
男性早上小便刺痛怎么办
夜尿增多的护理

  数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库的连接,这一点我们可以理解,毕竟目前所有的应用服务器取数据库连接的方式都是这种方式实现的。但是另外一个共同的问题是,它们同时不允许使用者显式的调用ose()方法,而需要用其规定的一个方法来关闭连接。这种做法有两个缺点:  :改变了用户使用习惯,增加了用户的使用难度。

  首先我們來看看一個正常的數據庫操作過程:

  intexecuteSQL(Stringsql)throwsSQLException

  {

  Connectionconn=getConnection();//通过某种方式获取数据库连接

  PreparedStatementps=null;

  intres=0;

  try{

  ps=epareStatement(sql);

  res=ecuteUpdate();

  }finally{

  try{

  ose();

  }catch(Exceptione){}

  try{

  ose();//

  }catch(Exceptione){}

  }

  returnres;

  }  使用者在用完数据库连接后通常是直接调用连接的方法close来释放数据库资源,如果用我们前面提到的连接池的实现方法,那语句ose()将被某些特定的语句所替代。

  第二:使连接池无法对之中的所有连接进行独占控制。由于连接池不允许用户直接调用连接的close方法,一旦使用者在使用的过程中由于习惯问题直接关闭了数据库连接,那么连接池将无法正常维护所有连接的状态,考虑连接池和应用由不同开发人员实现时这种问题更容易出现。

  综合上面提到的两个问题,我们来讨论一下如何解决这两个要命的问题。

  首先我们先设身处地的考虑一下用户是想怎么样来使用这个数据库连接池的。用户可以通过特定的方法来获取数据库的连接,同时这个连接的类型应该是标准的nnection。用户在获取到这个数据库连接后可以对这个连接进行任意的操作,包括关闭连接等。

  通过对用户使用的描述,怎样可以接管ose方法就成了我们这篇文章的主题。

  为了接管数据库连接的close方法,我们应该有一种类似于钩子的机制。例如在Windows编程中我们可以利用Hook API来实现对某个Windows API的接管。在JAVA中同样也有这样一个机制。JAVA提供了一个Proxy类和一个InvocationHandler,这两个类都在flect包中。我们先来看看SUN公司提供的文档是怎么描述这两个类的。   publicinterfaceInvocationHandler

  InvocationHandleristheinterfaceimplementedbytheinvocationhandlerofaproxyinstance.

  Eachproxyinstancehasanassociatedinvocationhandler.

  Whenamethodisinvokedonaproxyinstance,

  themethodinvocationisencodedanddispatchedtotheinvokemethodofitsinvocationhandler.  SUN的API文档中关于Proxy的描述很多,这里就不罗列出来。通过文档对接口InvocationHandler的描述我们可以看到当调用一个Proxy实例的方法时会触发Invocationhanlder的invoke方法。从JAVA的文档中我们也同时了解到这种动态代理机制只能接管接口的方法,而对一般的类无效,考虑到nnection本身也是一个接口由此就找到了解决如何接管close方法的出路。

  首先,我们先定义一个数据库连接池参数的类,定义了数据库的JDBC驱动程序类名,连接的URL以及用户名口令等等一些信息,该类是用于初始化连接池的参数,具体定义如下:

  publicclassConnectionParamimplementsSerializable

  {

  privateStringdriver;//数据库驱动程序

  privateStringurl;//数据连接的URL

  privateStringuser;//数据库用户名

  privateStringpassword;//数据库密码

  privateintminConnection=0;//初始化连接数

  privateintmaxConnection=50;//连接数

  privatelongtimeoutValue=600000;//连接的空闲时间

  privatelongwaitTime=30000;//取连接的时候如果没有可用连接的等待时间

  其次是连接池的工厂类ConnectionFactory,通过该类来将一个连接池对象与一个名称对应起来,使用者通过该名称就可以获取指定的连接池对象,具体代码如下:

  /**

  *连接池类厂,该类常用来保存多个数据源名称合数据库连接池对应的哈希

  *@authorliusoft

  */

  publicclassConnectionFactory

  {

  //该哈希表用来保存数据源名和连接池对象的关系表

  staticHashtableconnectionPools=null;

  static{

  connectionPools=newHashtable(2,0.75F);

  }

  /**

  *从连接池工厂中获取指定名称对应的连接池对象

  *@paramdataSource连接池对象对应的名称

  *@returnDataSource返回名称对应的连接池对象

  *@throwsNameNotFoundException无法找到指定的连接池

  */

  publicstaticDataSourcelookup(StringdataSource)

  throwsNameNotFoundException

  {

  Objectds=null;

  ds=t(dataSource);

  if(ds==null||!(dsinstanceofDataSource))

  thrownewNameNotFoundException(dataSource);

  return(DataSource)ds;

  }

  /**

青春可爱又个性时尚写满俏皮与青春的痕迹
清新自然的夏季钉珠女装
郑渊洁反盗版出奇招 开办网络电视台
相关文章
  • 取消药品加成抗菌药用量减少
    取消药品加成抗菌药用量减少

    " 8月1日,卫生部颁布的《抗菌药物临床应用管理办法》正式实施,被称为史上严厉的抗菌药物限令。新规实施半月,南都调查发现,深圳药店无需处方即可购买抗菌药的情况仍然存在。业内人士表示,《办法》仅针对医疗机构,对于非医疗机构的药店几乎只字未提...

  • 周杰伦承认已下跪求婚称旧疾不影响生娃
    周杰伦承认已下跪求婚称旧疾不影响生娃

    据香港媒体报道,台湾天王周杰伦(周董)圣诞节举办新专辑《哎呦,不错哦》发片会,虽然他一开始说:“今天只谈专辑,不是新婚发布会。”但对于即将告别单身的他还是侃侃而谈,说:“说不定结婚以后会写《听老婆的话》、《听小孩的话》,因为我全家大小都...

  • 新华社评河源高速垮塌一定会塌的解释令人震
    新华社评河源高速垮塌一定会塌的解释令人震

    新华社评河源高速垮塌:一定会塌的解释令人震惊新华广州6月20日电题:“理论上一定会坍塌”的高速公路桥,你敢走吗?19日凌晨,粤赣高速公路河源境内匝道桥梁坍塌,4辆货车掉落,当场造成1人死亡4人受伤。这座设计使用年限为100年的桥梁,竟然在投入使用不到1...

  • 男子写字楼内抱住女子点火自焚2人重伤入院
    男子写字楼内抱住女子点火自焚2人重伤入院

    写字楼内,男子抱住女子点火自焚两人生命垂危另有一人烧伤 警方称源于感情纠纷他拿着手提包,走进位于福田区卓越时代广场的陈小姐公司内,坐下,沉默了十分钟。接下来的一幕让公司其他人惊诧不已:他往自己身上浇汽油,点燃,用刀挟持陈小姐;他往自己脖...

  • 广州富力罕见遭遇三连败原因解析热点资讯
    广州富力罕见遭遇三连败原因解析热点资讯

    前两个赛季,广州富力一直被视为“主场龙”,如今却罕见遭遇主场三连败。今年富力客场拿到了17分,主场却只拿到14分,曾经的“客场虫”让人惊讶,但同时也让人对其主场的低迷疑惑不解。主场几乎每场都狂攻对手球门,但为何拿不下?是什么原因导致富力主场...

  • 巴西高官扎堆访华跑部基建外交升温
    巴西高官扎堆访华跑部基建外交升温

    巴西官员已经成为中国交通运输部(下称“交通部”)的“常客”。5月20日,交通部部长杨传堂在京会见了来访的巴西交通部部长凯撒·博尔热斯和巴西国家经济社会发展银行行长卢西亚诺·科蒂尼奥。官方信息显示,双方就加强铁路等交通基础设施领域合作交换了意见...