数据库连接是一种关键、有限且昂贵的资源,这在多用户web应用中尤为突出。数据库连接的管理会显著影响整个应用程序的可扩展性和健壮性以及程序的性能指标。数据库连接池就是为了解决这个问题而提出的。
数据库连接池负责分配、管理和释放数据库连接。它允许应用程序重用现有的数据库连接,而不是重新建立另一个数据库连接。释放空闲时间超过最大空闲时间的数据库连接,避免因不释放数据库连接而导致的数据库连接遗漏,可以明显提高数据库操作的性能。
当数据库连接池被初始化时,一定数量的数据库连接将被创建并放入连接池。这些数据库连接的数量由数据库连接的最小数量决定。不管这些数据库连接是否被使用,连接池总是确保至少有这么多的连接。当应用程序从连接池中请求的连接数超过最大连接数时,这些请求将被添加到等待队列中。
设置数据库连接池的最小和最大连接数时,应考虑以下因素:
1.最小连接数是连接池一直保持的数据库连接,所以如果应用程序不使用大量的数据库连接,就会浪费大量的数据库连接资源。
2.最大连接数是连接池申请的最大连接数。如果数据库连接请求超过次数,后续的数据库连接请求将被添加到等待列表中,这将影响后续的数据库操作。
如果最小连接数和最大连接数相差太大,那么第一个连接请求就有利可图,后续超过最小连接数的连接请求就相当于建立了一个新的数据库连接。但是,这些小于最小连接数的数据库连接在使用后不会立即被释放,而是被放入连接池中等待重用或在空闲超时后被释放。
实例使用的tomcat版本是6.0
方法1:在Tomcat的conf/context.xml中配置它
在Tomcat \ Apache-Tomcat-6 . 0 . 33 \ conf目录下的context.xml文件中配置默认值,如下所示:
?xml版本='1.0 '编码='utf-8 '
语境
watched resource web-INF/web . XML/watched resource
/上下文
配置连接池:
?xml版本='1.0 '编码='utf-8 '
语境
watched resource web-INF/web . XML/watched resource
!-配置oracle数据库的连接池-
资源名称='jdbc/oracleds '
作者='容器'
type='javax.sql.DataSource '
maxActive='100 '
maxIdle='30 '
maxWait='10000 '
用户名='斯科特'
密码='老虎'
driver class name=' Oracle . JDBC . dirver . Oracle driver '
URL=' JDBC:Oracle:thin:@ 127 . 0 . 0 . 1:1521:ora 9 '/
!-配置mysql数据库的连接池,
额外的一步就是把mysql的Java驱动类放到tomcat的lib目录下。
maxiidle连接池中最多可以有maxiidle个空闲连接。
minIdle连接池中至少有maxIdle个连接处于空闲状态。
初始化大小初始化连接数
当maxWait连接池中的连接用完时,新请求的等待时间(毫秒)
用户名数据库用户名
密码数据库密码
-
资源名称='jdbc/mysqlds '
auth='Container '
type='javax.sql.DataSource '
用户名='root '
密码='root '
maxIdle='30 '
maxWait='10000 '
maxActive='100 '
driver class name=' com . MySQL . JDBC . driver '
URL=' JDBC:MySQL://127 . 0 . 0 . 1:3306/db _ blog '/
/上下文
配置后需要注意的两个步骤。
1.把对应数据库的驱动类放到Xi安的tomcat的lib目录下。
2.重新启动tomcat服务器以使配置生效。
在web应用程序的web.xml中设置数据源引用,如下所示:
在web-app/web-app节点中添加以下内容
资源参考
描述mysql数据库连接池/描述
!-引用数据源的名称,与Tomcat中配置的资源节点中name属性' jdbc/mysqlds '的值一致-
RES-ref-name JDBC/mysqlds/RES-ref-name
!-资源类型-
res-typejavax.sql.DataSource/res-type
资源授权容器/资源授权
RES-sharing-scope shareable/RES-sharing-scope
/资源引用
错误解决:
javax。命名。noinitialcontextexception:需要在环境或系统属性中指定类名,或者作为小应用程序参数,或者在应用程序资源文件中指定类名:java.naming.factory.initial
位于javax。命名。SPI。命名经理。获取初始上下文(命名管理器。Java:645)
位于javax。命名。初始上下文。getdefaultinitctx(初始上下文。Java:288)
位于javax。命名。初始上下文。geturlordefaultinitctx(初始上下文。Java:325)
位于javax。命名。初始上下文。查找(初始上下文。Java:392)
位于com。我写博客。util。dbpoolutil。clinit(dbpoolutil。Java:34)
解决方案:
上面的异常信息是配置文件中JNDI没有初始化造成的
如果下面的问题都不存在
1.要去检查下配置文件中连接数据库的统一资源定位器参数是否正确2.以及是否导入了正常的包3.检查在雄猫中conf/server.xml文件,检查是否设置useNaming='false '如果是,去掉
2.那就是通过主要的方法测试的,这个数据源不支持这样的测试方法,程序要运行在雄猫中才能找到相应的数据源。[我在测试时犯这样的错导致上面错误出现]
% @ page language=' Java '页面编码=' UTF-8 '内容类型=' text/html;charset=UTF-8'%
%@个页面导入=' Java . SQL . * ' ' %
%@个页面导入=' javax . naming . * ' ' %
%@个页面导入='javax.sql.DataSource' %
超文本标记语言
头
titleTomcat6.0 JNDI!/标题
/头
身体
雄猫连接池测试,获取数据源英国铁路公司
%
尝试{
//初始化查找命名空间
上下文CTX=新的初始上下文();
//参数java:/comp/env为固定路径
上下文环境上下文=(上下文)CTX。lookup(' Java:/comp/env ');
//参数jdbc/mysqlds为数据源和JNDI绑定的名字
数据源ds=(数据源)环境上下文。查找(' JDBC/mysqlds ');
连接接头=ds。getconnection();
conn . close();
出去。println(' span style=' color:red;JNDI测试成功span’);
} catch (NamingException e) {
e。printstacktrace();
} catch (SQLException e) {
e。printstacktrace();
}
%
/body
/html
运行效果:
方法二:在雄猫的conf/server.xml中配置
打开雄猫的conf/server.xml文件,找到全球命名资源/全球命名资源节点,默认的内容如下
全球命名资源
资源名称='用户数据库'身份验证='容器'
type=' org。阿帕奇。卡特琳娜。'用户数据库'
描述="可以更新和保存的用户数据库"
工厂='组织。阿帕奇。卡特琳娜。用户。' memoryuserdatabasefactory '
路径名=' conf/Tomcat-users。XML '/
/GlobalNamingResources
在该节点中加入相关的池配置信息,如下
全球命名资源
资源名称='用户数据库'身份验证='容器'
type=' org。阿帕奇。卡特琳娜。'用户数据库'
描述="可以更新和保存的用户数据库"
工厂='组织。阿帕奇。卡特琳娜。用户。' memoryuserdatabasefactory '
路径名=' conf/Tomcat-users。XML '/
!-配置关系型数据库数据库的连接池,
需要做的额外步骤是将关系型数据库的Java 语言(一种计算机语言,尤用于创建网站)语言(一种计算机语言,尤用于创建网站)驱动类放到雄猫的解放运动目录下
-
Reso