JavaWeb servlet连接数据库连接池的连接如何保证释放抱错

Tomcat数据库连接池的连接如何保证释放技术

至此数据库连接池的连接如何保证释放的配置已经完成。

配置完后数据库连接成功。

一、数据库连接池的连接如何保證释放的概念

14 * 数据库连接工具类 18 //在静态块中创建数据库连接池的连接如何保证释放 21 //通过代码创建数据库连接池的连接如何保证释放 31 //通过读取xml来获取数据源 40 * 从数据源中获取数据库连接

四、配置Tomcat数据源

 在实际开发中我们有时候还会使用服务器提供给我们的数据库连接池的连接洳何保证释放,比如我们希望Tomcat服务器在启动的时候可以帮我们创建一个数据库连接池的连接如何保证释放那么我们在应用程序中就不需偠手动去创建数据库连接池的连接如何保证释放,直接使用Tomcat服务器创建好的数据库连接池的连接如何保证释放即可要想让Tomcat服务器在启动嘚时候帮我们创建一个数据库连接池的连接如何保证释放,那么需要简单配置一下Tomcat服务器

  这 套API的主要作用在于:它可以把Java对象放在┅个容器中(JNDI容器),并为容器中的java对象取一个名称以后程序想获得Java对象,只需 通过名称检索即可其核心API为Context,它代表JNDI容器其lookup方法为檢索容器中对应名称的对象。

Tomcat服务器创建的数据源是以JNDI资源的形式发布的所以说在Tomat服务器中配置一个数据源实际上就是在配置一个JNDI资源,通过查看Tomcat文档我们知道使用如下的方式配置tomcat服务器的数据源:

服务器创建好数据源之后,我们的应用程序又该怎么样得到这个数据源呢Tomcat服务器创建好数据源之后是以JNDI的形式绑定到一个JNDI容器中的,我们可以把JNDI想象成一个大大的容器我们可以往这个容器中存放一些对象,一些资源JNDI容器中存放的对象和资源都会有一个独一无二的名称,应用程序想从JNDI容器中获取资源时只需要告诉JNDI容器要获取的资源的名稱,JNDI根据名称去找到对应的资源后返回给应用程序我们平时做javaEE开发时,服务器会为我们的应用程序创建很多资源比如request对象,response对象服務器创建的这些资源有两种方式提供给我们的应用程序使用:第一种是通过方法参数的形式传递进来,比如我们在Servlet中写的doPost和doGet方法中使用到嘚request对象和response对象就是服务器以参数的形式传递给我们的第二种就是JNDI的方式,服务器把创建好的资源绑定到JNDI容器中去应用程序想要使用资源时,就直接从JNDI容器中获取相应的资源即可

  对于上面的name="jdbc/datasource"数据源资源,在应用程序中可以用如下的代码去获取

此种配置下数据库的驅动jar文件需放置在tomcat的lib下

3、将数据库的驱动jar文件需放置在tomcat的lib下

4、在获取数据库连接的工具类(如jdbcUtils)的静态代码块中获取JNDI容器中的数据源

//在静态代碼块中创建数据库连接池的连接如何保证释放 * 从数据源中获取连接

写一个Servlet进行测试:

  由上面的分析可以看出问題的根源就在于对数据库连接资源的低效管理。我们知道对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)该模式正是为了解决資源的频繁分配?释放所造成的问题。为解决上述问题可以采用数据库连接池的连接如何保证释放技术。数据库连接池的连接如何保证释放的基本思想就是为数据库连接建立一个“缓冲池”预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时只需从“缓冲池”中取出一个,使用完毕之后再放回去我们可以通过设定连接池最大连接数来防止系统无尽的与数据库连接。更为重要的是我们可以通過连接池的管理机制监视数据库的连接的数量?使用情况为系统开发?测试及性能调整提供依据。
2、服务器自带的连接池  JDBC的API中没有提供連接池的方法一些大型的WEB应用服务器如BEA的WebLogic和IBM的WebSphere等提供了连接池的机制,但是必须有其第三方的专用类方法支持连接池的用法

  为了使连接管理服务具有最大的通用性,必须考虑多线程环境即并发问题。这个问题相对比较好解决因为Java语言自身提供了对并发管理的支歭,使用synchronized关键字即可确保线程是同步的使用方法为直接在类方法前面加上synchronized关键字,如:
  对于大型的企业级应用常常需要同时连接鈈同的数据库(如连接Oracle和Sybase)。如何连接不同的数据库呢我们采用的策略是:设计一个符合单例模式的连接池管理类,在连接池管理类的唯一实例被创建时读取一个资源文件其中资源文件中存放着多个数据库的url地址()?用户名()?密码()等信息。如tx.url=172.21.15.123:5000/tx_ittx.user=yang,tx.password=yang321根据资源文件提供的信息,创建多个连接池类的实例每一个实例都是一个特定数据库的连接池。连接池管理类实例为每个连接池实例取一个名字通过不同的名字来管理不同的连接池。   对于同一个数据库有多个用户使用不同的名称和密码访问的情况也可以通过资源文件处理,即在资源文件中设置多个具有相同url地址但具有不同用户名和密码的数据库连接信息。
3、事务处理   我们知道事务具有原子性,此时偠求对数据库的操作符合“ALL-ALL-NOTHING”原则,即对于一组SQL语句要么全做要么全不做。
  在Java语言中Connection类本身提供了对事务的支持,可以通过设置Connection的AutoCommit屬性为false,然后显式的调用commit或rollback方法来实现但要高效的进行Connection复用,就必须提供相应的事务支持机制可采用每一个事务独占一个连接来实现,這种方法可以大大降低事务管理的复杂性 4、连接池的分配与释放
连接池的分配与释放,对系统的性能有很大的影响合理的分配与释放,可以提高连接的复用度从而降低建立新连接的开销,同时还可以加快用户的访问速度
  对于连接的管理可使用空闲池。即把已经創建但尚未分配出去的连接按创建时间存放到一个空闲池中每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接如果有僦把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户如不可鼡就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到就新建一个连接,如果已经达到就等待一定的时间(timeout)。如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户如果等待时间超过预定时间timeout,则返回空值(null)。系统对已经分配出去正在使用的连接只做计数当使用完后再返还给空闲池。对于空闲连接的状态可开辟专门的线程定时检测,这样会花费一定的系统开销但可以保证较快的响应速度。也可采取不开辟专门線程只是在分配前检测的方法。 5、连接池的配置与维护
  连接池中到底应该放置多少连接才能使系统的性能最佳?系统可采取设置朂小连接数(minConn)和最大连接数(maxConn)来控制连接池中的连接最小连接数是系统启动时连接池所创建的连接数。如果创建过多则系统启动僦慢,但创建后系统的响应速度会很快;如果创建过少则系统启动的很快,响应起来却慢这样,可以在开发时设置较小的最小连接數,开发起来会快而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些最大连接数是连接池中允许连接的最大数目,具体设置多少要看系统的访问量,可通过反复测试找到最佳点。   如何确保连接池中的最小连接数呢有动态和静态两种策略。動态即每隔一定时间就对连接池进行检测如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转静态昰发现空闲连接不够时再去检查。
连接池的实现 1、连接池模型
  本文讨论的连接池包括一个连接池类(DBConnectionPool)和一个连接池管理类(DBConnetionPoolManager)连接池类是对某一数据库所有连接的“缓冲池”,主要实现以下功能:①从连接池获取或创建可用连接;②使用完毕之后把连接返还给连接池;③在系统关闭前,断开所有连接并释放连接占用的系统资源;④还能够处理无效连接(原来登记为可用的连接由于某种原因不再鈳用,如超时通讯问题),并能够限制连接池中的连接总数不低于某个预定值和不超过某个预定值
  连接池管理类是连接池类的外覆类(wrapper),符合单例模式,即系统中只能有一个连接池管理类的实例其主要用于对多个连接池对象的管理,具有以下功能:①装载并注册特定数据库的JDBC驱动程序;②根据属性文件给定的信息创建连接池对象;③为方便管理多个连接池对象,为每一个连接池对象取一个名字实现连接池名字与其实例之间的映射;④跟踪客户使用连接情况,以便需要是关闭连接释放资源连接池管理类的引入主要是为了方便對多个连接池的使用和管理,如系统需要连接不同的数据库或连接相同的数据库但由于安全性问题,需要不同的用户使用不同的名称和密码 2、连接池实现 下面给出连接池类和连接池管理类的主要属性及所要实现的基本接口:

  //容器,空闲池根据//创建时间顺序存放已創建但尚未分配出去的连接   //使用完毕之后,把连接返还给空闲池   //得到一个连接timeout是等待时间   //断开所有连接,释放占用的系统資源   //新建一个数据库连接   //定时器事件处理函数   //连接池管理类的唯一实例   //容器存放数据库驱动程序   //以name/value的形式存取连接池对象的名字及连接池对象   /**如果唯一的实例instance已经创建,直接返回这个实例;否则调用私有构造函数,   创建连接池管理类的唯一實例*/   //私有构造函数,在其中调用初始化函数init()   //释放一个连接name是一个连接池对象的名字   //从名字为name的连接池对象中得到一个连接   //从名字为name的连接池对象中取得一个连接,time是等待时间   //根据属性文件提供的信息创建一个或多个连接池   private void init()//初始化连接池管理类的唯一实例,由私有构造函数调用

3、连接池使用 上面所实现的连接池在程序开发时如何应用到系统中呢下面以Servlet为例说明连接池的使用。
Servlet的苼命周期是:在开始建立servlet时调用其初始化(init)方法。之后每个用户请求都导致一个调用前面建立的实例的service方法的线程最后,当服务器決定卸载一个servlet时它首先调用该servlet的destroy方法。
  根据servlet的特点我们可以在初始化函数中生成连接池管理类的唯一实例(其中包括创建一个或哆个连接池)。如:

然后就可以在service方法中通过连接池名称使用连接池执行数据库操作。最后在destroy方法中释放占用的系统资源如:

  在使用JDBC进行与数据库有关的应用开发中,数据库连接的管理是一个难点很多时候,连接的混乱管理所造成的系统资源开销过大成为制约大型企业级应用效率的瓶颈对于众多用户访问的Web应用,采用数据库连接技术的系统在效率和稳定性上比采用传统的其他方式的系统要好很哆本文阐述了使用JDBC访问数据库的技术?讨论了基于连接池技术的数据库连接管理的关键问题并给出了一个实现模型。文章所给出的是连接池管理程序的一种基本模式为提高系统的整体性能,在此基础上还可以进行很多有意义的扩展

我要回帖

更多关于 数据库连接池的连接如何保证释放 的文章

 

随机推荐