数据库连接是一种关键、有限且昂贵的资源,这在多用户web应用中尤为突出。数据库连接的管理会显著影响整个应用程序的可扩展性和健壮性以及程序的性能指标,数据库连接池就是为解决这一问题而提出的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重用一个已有的数据库连接,而不是重新建立一个;释放空闲时间超过最大空闲时间的数据库连接,避免因不释放数据库连接而造成的数据库连接遗漏,可以明显提高数据库操作的性能。
当数据库连接池被初始化时,一定数量的数据库连接将被创建并放入连接池。这些数据库连接的数量由数据库连接的最小数量决定。不管这些数据库连接是否被使用,连接池总是确保至少有这么多的连接。当应用程序从连接池中请求的连接数超过最大数量时,这些请求将被添加到等待队列中。
设置数据库连接池的最小和最大连接数时,应考虑以下因素:
1.最小连接数是连接池一直保持的数据库连接,所以如果应用程序很少使用数据库连接,就会浪费很多数据库连接资源。
2.最大连接数是连接池应用程序的最大数量。如果数据库连接请求超过次数,后续的数据库连接请求将被添加到等待队列中,这将影响后续的数据库操作。
如果最小连接数和最大连接数相差太大,第一个连接请求就有利可图,然后超过最小连接数的连接请求就相当于建立了一个新的数据库连接。但是,这些小于最小连接数的数据库连接不会在使用后立即释放,它们将被放入连接池中以供重用或空闲超时。
实例使用的tomcat版本是6.0。
方法1:在Tomcat的conf/context.xml中配置
在Tomcat \ Apache-Tomcat-6 . 0 . 33 \ conf目录的context.xml文件中配置默认值,如下所示:
?xml version='1.0' encoding='utf-8'?
Context
WatchedResourceWEB-INF/web.xml/WatchedResource
/Context
配置连接池:
?xml version='1.0' encoding='utf-8'?
Context
WatchedResourceWEB-INF/web.xml/WatchedResource
!-配置oracle数据库的连接池-
Resource name='jdbc/oracleds'
author='Container'
type='javax.sql.DataSource'
maxActive='100'
maxIdle='30'
maxWait='10000'
username='scott'
password='tiger'
driverClassName='oracle.jdbc.dirver.OracleDriver'
url='jdbc:oracle:thin:@127.0.0.1:1521:ora9' /
!-配置mysql数据库的连接池,
额外的步骤是将mysql的Java驱动程序类放在tomcat的lib目录中。
Maxiidle连接在Maxiidle连接池中最多可以处于空闲状态。
minIdle连接池中的最小空闲maxIdle连接数。
初始化连接数。
当maxWait连接池中的连接用完时,新请求的等待时间,以毫秒为单位。
用户名数据库用户名
密码数据库密码
--
Resource name='jdbc/mysqlds'
auth='Container'
type='javax.sql.DataSource'
username='root'
password='root'
maxIdle='30'
maxWait='10000'
maxActive='100'
driverClassName='com.mysql.jdbc.Driver'
url='jdbc:mysql://127.0.0.1:3306/db_blog' /
/Context
配置后需要注意的两个步骤。
1.将相应数据库的驱动类放在tomcat Xi安的lib目录下。
2.重新启动tomcat服务器,以使配置生效。
在web应用程序的web.xml中设置数据源参考,如下:
在web-app/web-app节点中加入下面内容
resource-ref
descriptionmysql数据库连接池/description
!-- 参考数据源名字,同Tomcat中配置的Resource节点中name属性值'jdbc/mysqlds'一致--
res-ref-namejdbc/mysqlds/res-ref-name
!-- 资源类型--
res-typejavax.sql.DataSource/res-type
res-authContainer/res-auth
res-sharing-scopeShareable/res-sharing-scope
/resource-ref
错误解决:
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
at javax.naming.InitialContext.lookup(InitialContext.java:392)
at com.iblog.util.DBPoolUtil.clinit(DBPoolUtil.java:34)
解决方案:
上面的异常信息是配置文件中JNDI没有初始化造成的
如果下面的问题都不存在
1.要去检查下配置文件中连接数据库的URL参数是否正确2.以及是否导入了正常的包3.检查在Tomcat中conf/server.xml文件,检查是否设置useNaming='false',如果是,去掉
2.那就是通过main方法测试的,这个数据源不支持这样的测试方法,程序要运行在Tomcat中才能找到相应的数据源.[我在测试时犯这样的错导致上面错误出现]
%@ page language='java' pageEncoding='UTF-8' contentType='text/html; charset=UTF-8'%
%@ page import='java.sql.*' %
%@ page import='javax.naming.*' %
%@ page import='javax.sql.DataSource' %
html
head
titleTomcat6.0 JNDI!/title
/head
body
Tomcat连接池测试,获取数据源br
%
try {
//初始化查找命名空间
Context ctx=new InitialContext();
//参数java:/comp/env为固定路径
Context envContext=(Context)ctx.lookup('java:/comp/env');
//参数jdbc/mysqlds为数据源和JNDI绑定的名字
DataSource ds=(DataSource)envContext.lookup('jdbc/mysqlds');
Connection conn=ds.getconnection();
conn.close();
out.println('span style='color:red;'JNDI测试成功span');
} catch (NamingException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
%
/body
/html
运行效果:
方法二:在Tomcat的conf/server.xml中配置
打开tomcat的conf/server.xml文件,找到GlobalNamingResources/GlobalNamingResources节点,默认的内容如下
GlobalNamingResources
Resource name='UserDatabase' auth='Container'
type='org.apache.catalina.UserDatabase'
description='User database that can be updated and saved'
factory='org.apache.catalina.users.MemoryUserDatabaseFactory'
pathname='conf/tomcat-users.xml' /
/GlobalNamingResources
在该节点中加入相关的池配置信息,如下
GlobalNamingResources
Resource name='UserDatabase' auth='Container'
type='org.apache.catalina.UserDatabase'
description='User database that can be updated and saved'
factory='org.apache.catalina.users.MemoryUserDatabaseFactory'
pathname='conf/tomcat-users.xml' /
!--配置mysql数据库的连接池,
需要做的额外步骤是将mysql的Java驱动类放到tomcat的lib目录下
--
Reso