连接池绝对注意事项:
使用连接池时需要牢记的最重要事项是,无论在代码中出现了什么(异常、控制流等),连接以及由连接创建的任何部分(语句、结果集等)均应被关闭,以 便能再次使用它们。如不然,它们将纠缠在一起,在最好的情况下,意味着它们所代表的MySQL 服务器资源(缓冲区、锁定、套接字等)可能会捆绑一段时间, 在最坏的情况下,可能会导致永久捆绑。
连接池的最佳大小是什么?
与所有其他配置经验规则一样, 回答是“ 它取决于具体情况” 。尽管最佳大小取决与预期的负载和平均的数据库事务时间,最佳的连接池大小小于你的预期。例如,如果使用的是Sun 公司的 Java Petstore Blueprint 应用程序,对于包含15 ~20 个连接的连接池,使用MySQL 和Tomcat ,在可接受的相应时间下,可服务于中等程度的负载(600 个并发用户)。
要想确定用于应用程序的连接池大小,应使用诸如Apache Jmeter 或The Grinder 等工具创建负载测试脚本,并对应用程序进行负载测试。
确定出发点的一种简单方法是,将连接池的最大连接数配置为“ 无限” ,运行负载测试,并测量最大的并发连接数。随后,应进行反向操作,确定出使应用程序具有最佳性能的连接池的最小和最大值。
1 .将数据库驱动程序的JAR 文件放在Tomcat 的 /lib 中;
2. . 配置tomcat 下的conf 下的context.xml 文件, 在<context></context> 之间添加连接池如下:
<Resource name="jdbc/MySQL"
auth="Container"
type="javax.sql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:MySQL://localhost/notes"
username="root"
password="13579147"
maxActive="100"
maxIdle="30"
maxWait="10000" />
属性说明: name ,数据源名称,通常取 ”jdbc/XXX” 的格式;
type , ”javax.sql.DataSource”;
password ,数据库用户密码;
driveClassName ,数据库驱动;
maxIdle ,最大空闲数,数据库连接的最大空闲时间。超过空闲时间,数据库连
接将被标记为不可用,然后被释放。设为 0 表示无限制。
MaxActive ,连接池的最大数据库连接数。设为 0 表示无限制。
maxWait ,最大建立连接等待时间。如果超过此时间将接到异常。设为 -1 表示
无限制。
3 .在你的web 应用程序的web.xml 中设置数据源参考,如下:
在<web-app></web-app> 节点中加入,
< resource-ref >
< description > DB Connection </ description >
< res-ref-name > jdbc /MySQL </ res-ref-name >
< res-type > javax.sql.DataSource </ res-type >
< res-auth > Container </ res-auth >
</ resource-ref >
子节点说明: description ,描述信息;
res-ref-name ,参考数据源名字;
res-type ,资源类型,”javax.sql.DataSource” ;
res-auth ,”Container” ;
res-sharing-scope ,”Shareable” ;
4 .建立一个测试jsp ,代码如下:
!doctype html public "-//w3c//dtd html 4.0 transitional//en"
"http://www.w3.org/TR/REC-html40/strict.dtd">
< %@ page import ="java.sql.*" %>
< %@ page import ="javax.sql.*" %>
< %@ page import ="javax.naming.*" %>
< %@ page session ="false" %>
< html >
< head >
< meta http-equiv ="Content-Type" content ="text/html; charset=gb2312" >
< title ></ title >
< %
out.print(" 我的测试开始");
DataSource ds
= null
;
try{
InitialContext ctx
=new
InitialContext();
ds =(DataSource)ctx.lookup("java:comp/env/jdbc/MySQL");
Connection conn
= ds
.getConnection();
Statement stmt
= conn
.createStatement();
提示:users 必须是数据库已有的表,
这里的数据库前文提及的Data Source URL 配置里包含的数据库。
String strSql = " select * from users" ;
ResultSet rs = stmt .executeQuery(strSql);
while(rs.next()){
out.print(rs.getString(1));
}
out.print(" 我的测试结束");
}
catch(Exception ex){
out.print(“ 出现例外信息是:”+ex.getMessage());
ex.printStackTrace();
}
%>
</ head >
< body >
</ body >
</ html >
2 . 在要用到数据库操作的类或jsp 页面中,用DBPool.getPool().getConnection() ,获得一个Connection 对象,就可 以进行数据库操作,最后别忘了对Connection 对象调用close() 方法, 注意:这里不会关闭这个Connection ,而是将这个 Connection 放回数据库连接池。