数据库连接池使用

来源:互联网 发布:音乐裁剪合并软件 编辑:程序博客网 时间:2024/05/22 14:47

一、数据库连接池概述:
 *数据库连接是一种关键的有限的昂贵的资源,
 这一点在多用户的网页应用程序中体现得尤为突出。
 对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,
 影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
 
 *数据库连接池负责分配、管理和释放数据库连接,
 它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;
 释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
 这项技术能明显提高对数据库操作的性能。
 
 *数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,
 这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,
 连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,
 当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
 
 对于连接的管理可使用空闲池。即把已经创建但尚未分配出去的连接按创建时间存放到一个空闲池中。
 每当用户请求一个连接时,系统首先检查空闲池内有没有空闲连接。
 如果有就把建立时间最长(通过容器的顺序存放实现)的那个连接分配给他(实际是先做连接是否有效的判断,如果可用就分配给用户,如不可用就把这个连接从空闲池删掉,重新检测空闲池是否还有连接);
 如果没有则检查当前所开连接池是否达到连接池所允许的最大连接数(maxConn),如果没有达到,就新建一个连接,如果已经达到,就等待一定的时间(timeout)。
 如果在等待的时间内有连接被释放出来就可以把这个连接分配给等待的用户,如果等待时间超过预定时间timeout,则返回空值(null)。
 系统对已经分配出去正在使用的连接只做计数,当使用完后再返还给空闲池。对于空闲连接的状态,可开辟专门的线程定时检测,这样会花费一定的系统开销,但可以保证较快的响应速度。也可采取不开辟专门线程,只是在分配前检测的方法
 
 *数据库连接池的最小连接数和最大连接数的设置要考虑到下列几个因素:
 1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
 2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
 3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
 
 总结它的优势:1)资源的重复利用2)响应速度快3)统一连接管理
 
二、JNDI(Java Naming and Directory Interface):一组帮助做多个命名和目录服务接口的API
 建立起逻辑关联,允许把名称同Java对象或资源关联起来,而不必知道对象或资源的物理ID。
 JNDI与JDBC: JNDI提供了一种统一的方式,可以用在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或命名服务中的一个纪录,同时返回数据库连接建立所必须的信息。
 JDNI通过绑定的概念将对象和名称联系起来。在一个文件系统中,文件名被绑定给文件。在DNS(域名系统,Domain Name Server)中,一个IP地址绑定一个URL。在目录服务中,一个对象名被绑定给一个对象实体。

三、Tomcat中配置数据库连接池:
 方法一:
 1)配置"tomcat根目录/conf/context.xml"文件:(此处配置的数据库连接池可被tomcat中所有的应用共享)
 <Resource name="JNDI名称" auth="Container|Application" type="javax.sql.DataSource" maxActive="处于活动状态的最大连接数目" maxIdle="处于空闲状态的最大连接数目" maxWait="连接处于空闲状态的最长时间(毫秒数)" username="用户名" password="密码" driverClassName="连接数据库的驱动器类" url="连接数据库的URL" />
 2)配置web.xml文件:(可以省略)
 <resource-ref>
    <res-ref-name>JNDI名称</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
   </resource-ref>
   3)将连接数据库所需要的驱动器JAR包复制到:tomcat根目录/common/lib目录下;
   4)进行代码编写,使用lookup()方法获得数据源对象:
   Context ct = new InitialContext();
 DataSource ds = (DataSource) ct.lookup("java:comp/env/JNDI名称");
 Connection con = ds.getConnection();
 
 方法二:
 1)在"tomcat根目录/conf/Catalina/localhost"目录下配置一个相对于某个具体应用所使用的数据库连接池:(只能被当前Web应用所使用)
 <Context path="/web应用的访问路径上下文" docBase="某个Web应用程序根目录的路径" reloadable="true">
  <Resource name="JNDI名称" auth="Container|Application" type="javax.sql.DataSource" maxActive="处于活动状态的最大连接数目" maxIdle="处于空闲状态的最大连接数目" maxWait="连接处于空闲状态的最长时间(毫秒数)" username="用户名" password="密码" driverClassName="连接数据库的驱动器类" url="连接数据库的URL" />
 </Context>
 2)将连接数据库所需要的驱动器JAR包复制到:tomcat根目录/common/lib目录下;
   3)进行代码编写,使用lookup()方法获得数据源对象:
   Context ct = new InitialContext();
 DataSource ds = (DataSource) ct.lookup("java:comp/env/JNDI名称");
 Connection con = ds.getConnection();
 参考示例工程:connectorPoolDemo2

 第二种方法必须注意:
 //自己的实践 如果你的jsp文件包含 <c:for>或其他 等等 必须 将 你的standard.jar jstl.jar sql2005.jar  放到Tomcat 5.5/common/lib 目录下 否则它会找不到你要加载的标签文件 会报出下面的错误:
 严重: Servletjsp的Servlet.service()发生意外(exception)
 java.lang.NoClassDefFoundError: org/apache/taglibs/standard/tag/rt/core/ForEachTag
 但是放入jar包后 重新部署 运行服务 程序会报出错误 :
严重: IOException while loading persisted sessions: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: accp.entity.FoodInfo
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: accp.entity.FoodInfo
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1303)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
 at java.util.ArrayList.readObject(ArrayList.java:587)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
 at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1392)
 at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:921)
 at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:393)
 at org.apache.catalina.session.StandardManager.load(StandardManager.java:320)
 at org.apache.catalina.session.StandardManager.start(StandardManager.java:636)
 at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:431)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4155)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:608)
 at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:535)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
 at org.apache.catalina.core.StandardService.start(StandardService.java:450)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Caused by: java.io.NotSerializableException: accp.entity.FoodInfo
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
 at java.util.ArrayList.writeObject(ArrayList.java:569)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:890)
 at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1333)
 at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
 at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1468)
 at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:938)
 at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:516)
 at org.apache.catalina.session.StandardManager.unload(StandardManager.java:462)
 at org.apache.catalina.session.StandardManager.stop(StandardManager.java:666)
 at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4358)
 at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:892)
 at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1164)
 at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1135)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1054)
 at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1066)
 at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:447)
 at org.apache.catalina.core.StandardService.stop(StandardService.java:512)
 at org.apache.catalina.core.StandardServer.stop(StandardServer.java:743)
 at org.apache.catalina.startup.Catalina.stop(Catalina.java:601)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:576)
 ... 6 more
2008-9-18 11:18:41 org.apache.catalina.session.StandardManager start
严重: Exception loading sessions from persistent storage
java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: accp.entity.FoodInfo
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1303)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
 at java.util.ArrayList.readObject(ArrayList.java:587)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:919)
 at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1813)
 at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1713)
 at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1299)
 at java.io.ObjectInputStream.readObject(ObjectInputStream.java:339)
 at org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1392)
 at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:921)
 at org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:393)
 at org.apache.catalina.session.StandardManager.load(StandardManager.java:320)
 at org.apache.catalina.session.StandardManager.start(StandardManager.java:636)
 at org.apache.catalina.core.ContainerBase.setManager(ContainerBase.java:431)
 at org.apache.catalina.core.StandardContext.start(StandardContext.java:4155)
 at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:759)
 at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:739)
 at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:524)
 at org.apache.catalina.startup.HostConfig.deployDescriptor(HostConfig.java:608)
 at org.apache.catalina.startup.HostConfig.deployDescriptors(HostConfig.java:535)
 at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:470)
 at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1122)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:310)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1021)
 at org.apache.catalina.core.StandardHost.start(StandardHost.java:718)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1013)
 at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:442)
 at org.apache.catalina.core.StandardService.start(StandardService.java:450)
 at org.apache.catalina.core.StandardServer.start(StandardServer.java:709)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:551)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:294)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:432)
Caused by: java.io.NotSerializableException: accp.entity.FoodInfo
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1075)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
 at java.util.ArrayList.writeObject(ArrayList.java:569)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:890)
 at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1333)
 at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1284)
 at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1073)
 at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:291)
 at org.apache.catalina.session.StandardSession.writeObject(StandardSession.java:1468)
 at org.apache.catalina.session.StandardSession.writeObjectData(StandardSession.java:938)
 at org.apache.catalina.session.StandardManager.doUnload(StandardManager.java:516)
 at org.apache.catalina.session.StandardManager.unload(StandardManager.java:462)
 at org.apache.catalina.session.StandardManager.stop(StandardManager.java:666)
 at org.apache.catalina.core.StandardContext.stop(StandardContext.java:4358)
 at org.apache.catalina.core.ContainerBase.removeChild(ContainerBase.java:892)
 at org.apache.catalina.startup.HostConfig.undeployApps(HostConfig.java:1164)
 at org.apache.catalina.startup.HostConfig.stop(HostConfig.java:1135)
 at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:312)
 at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
 at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1054)
 at org.apache.catalina.core.ContainerBase.stop(ContainerBase.java:1066)
 at org.apache.catalina.core.StandardEngine.stop(StandardEngine.java:447)
 at org.apache.catalina.core.StandardService.stop(StandardService.java:512)
 at org.apache.catalina.core.StandardServer.stop(StandardServer.java:743)
 at org.apache.catalina.startup.Catalina.stop(Catalina.java:601)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:576)
 ... 6 more

 但是程序可以正常运行。!!!其实这个错误的原因是因为你的实体类不能被序列化 只要在你的实体类
 上加上一个 implements Serializable 实现可序列化接口 这个错误就排出了!!!
 
 方法三:在"tomcat根目录/conf/server.xml"的<Host>节点下配置一个<Context>节点,配置方法和方法二相同(也只能被当前Web应用所使用);
 


 
 
 方法四:在"tomcat"控制台进行配置,然后在"tomcat根目录/conf/context.xml"添加:<ResourceLink global="JNDI名" name="JNDI名" type="javax.sql.DataSource"/>


 <resource-ref>
  <description>Food and User</description>
  <res-ref-name>jdbc/Food</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>

 </resource-ref>
 
 
 
 
 
 
 

 

原创粉丝点击