您的位置:首页 > 运维架构 > Tomcat

tomcat中的几种连接池配置代码

2009-02-02 19:54 393 查看
对于大型网站来说,信息查询的次数会非常多,每次查询都需要这样的过程:加载驱动程序、创建连接、创建语句对象、执行SQL语句、关闭这些对象。建立与数据库之间的连接和释放连接会占用很多系统的时间。如果能够让所有用户共享连接,仅仅创建一次连接,谁需要连接谁就使用,这样可以大大减少创建连接所占用的时间。让所有用户共享连接,并且在需要的时候就能够使用,就需要有专门的机制来创建连接,数据库连接池(Dababase Connection Pool,简称DBCP)技术就是来解决这个问题的。
DBCP能够集中管理Web应用中的所有连接,提前创建好若干到数据库的连接,用户需要的时候从连接池中获取一个连接,用完之后重新把连接放回连接池。要使用DBCP,首先需要配置JNDI数据源。
配置JNDI数据源
DBCP可以使用很多技术实现,本书介绍的是比较流行的Jakarta-Commons的DBCP。
使用连接池的时候,存在一个问题。Web应用必须显式的关闭结果集对象、语句对象、连接对象,如果关闭失败,将导致这些对象不能重用。可能还会导致在连接使用完的时候,Web应用无法连接到数据库。
Jakarta-Commons的DBCP提供了一种机制,能够跟踪和恢复那些不能被管理的连接。要想跟踪和恢复那些不能被管理的连接,需要在配置数据源的时候增加下面的代码:
removeAbandoned="true"
当可用的连接数比较少的使用,连接池会查找并重复使用这些不能被管理的连接。可以使用removeAbandonedTimeout属性设置一个连接空闲多少秒之后被认为是已经被放弃的,默认值是300秒。如果想改为60秒,可以使用下面的代码:
removeAbandonedTimeout="60"
可以设置logAbandoned属性来记录没有正确释放连接的代码:
logAbandoned="true"

<!--局部数据库连接池(两种方法) Tomcat6.0连接池配置 -->

<!--第一种方法-->
配置server.xml
server.xml文件在Tomcat安装目录的conf子目录下。在</host>之前增加下面的代码:
<Context path="/bookstore" docBase="bookstore(项目名称)"
debug="5" reloadable="true" crossContext="true">
<Resource name="jdbc/connpool" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="j2ee"
password="j2ee"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>
</Context>

<!--第二种方法-->

<Resource name="jdbc/connpool" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30"
maxWait="10000" username="j2ee" password="j2ee" driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"/>

各属性的含义如下:
1 maxActive: 池中连接的最大数目。要确保把mysql的最大连接数大于这个值。如果为0,则没有最大数量限制。
2 maxIdle: 池中最大空闲数据库连接数。如果为-1,则没有限制。
3 axWait: 等待一个连接变成可用的最长时间,单位是ms,这个例子中是10秒,如果超时将抛出异常。如果设置为-1,将无限等待
4 username 和 password: 连接MySQL数据库的用户名和口令
5 driverClassName: MySQL数据库的JDBC驱动程序的名字,这里驱动的名字是com.mysql.jdbc.Driver。
6 url: JDBC连接MySQL数据库的url。参数autoReconnect=true确保连接池能够重新连接,如果8个小时没有操作,mysql管理器会关闭连接。
配置web.xml
需要为当前应用配置web.xml。主要作用是声明数据源。代码如下:
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
使用连接池访问数据库
使用连接池访问数据库与使用JDBC直接访问数据库的过程基本相同,只是得到连接的方式不同。
下面的代码展示了在使用连接池的时候,如果获取到数据库的连接。
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/DBPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
}
public static DataSource getPool() {
return pool;
}
}

全局数据库连接池的配置:

1.将数据库驱动程序的JAR文件放在Tomcat的 common/lib 中;
2.在server.xml中设置数据源,以Oracle数据库为例,如下:
在<GlobalNamingResources> </GlobalNamingResources>节点中加入,
<Resource
name="jdbc/connpool"
type="javax.sql.DataSource"
password="j2ee"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxIdle="2"
maxWait="5000"
username="j2ee"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl"
maxActive="4"/>
属性说明: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>MySQL DB Connection Pool</description>
<res-ref-name>jdbc/connpool</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
子节点说明: description,描述信息;
res-ref-name,参考数据源名字,同上一步的属性name;
res-type,资源类型,”javax.sql.DataSource”;
res-auth,”Container”;
res-sharing-scope,”Shareable”;

<!--以下为设置数据源连接-->

<!--第一种-->

在tomcat/webapps/myapp/META-INF/context.xml的Context中增加:

<ResourceLink name="jdbc/connPool" global="jdbc/connPool" type="javax.sql.DataSource"/>
这样就可以了。

<!--第二种-->

在web应用程序的context.xml中设置数据源链接,如下:
在<Context></Context>节点中加入,
<ResourceLink
name="jdbc/connpool"
type="javax.sql.DataSource"
global="jdbc/connpool"/>
属性说明:name,同第2步和第3步的属性name值,和子节点res-ref-name值;
type,同样取”javax.sql.DataSource”;
global,同name值。

至此,设置完成,下面是如何使用数据库连接池。
1.建立一个连接池类,DBPool.java,用来创建连接池,代码如下:
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DBPool {
private static DataSource pool;
static {
Context env = null;
try {
env = (Context) new InitialContext().lookup("java:comp/env");
pool = (DataSource)env.lookup("jdbc/DBPool");
if(pool==null)
System.err.println("'DBPool' is an unknown DataSource");
} catch(NamingException ne) {
ne.printStackTrace();
}
}
public static DataSource getPool() {
return pool;
}
}

2.在要用到数据库操作的类或jsp页面中,用DBPool.getPool().getConnection(),获得一个Connection对象,就可以进行数据库操作,最后别忘了对Connection对象调用close()方法,注意:这里不会关闭这个Connection,而是将这个Connection放回数据库连接池。

第三种:tomcat5.0连接池配置

1.打开server.xml:在<Context > </Contex>中添加如下连接池参数语句,一个完整的例子如下:
<?xml version='1.0' encoding='utf-8'?>
<Context docBase="E:/Projects/ColorRing/wap" path="/wap" reloadable="true">
<Resource name="jdbc/wapOracle" auth="Container"
type="javax.sql.DataSource"/>
<ResourceParams name="jdbc/wapOracle"> <!--这里name的值必须与Resource里的name的值相同-->
<parameter>
<name>factory</name>
<value>org.apache.commons.dbcp.BasicDataSourceFactory</value>
</parameter>
<parameter>
<name>url</name>
<value>jdbc:oracle:thin:@172.18.51.101:1521:sundb</value> <!--连接数据库的url-->
</parameter>
<parameter>
<name>maxIdle</name>
<value>20</value>
</parameter>
<parameter>
<name>maxActive</name>
<value>0</value>
</parameter>
<parameter>
<name>driverClassName</name>
<value>oracle.jdbc.driver.OracleDriver</value>
</parameter>
<parameter>
<name>maxWait</name>
<value>5000</value>
</parameter>
<parameter>
<name>removeAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>username</name> <!--用户名-->
<value>cms_user</value>
</parameter>
<parameter>
<name>logAbandoned</name>
<value>true</value>
</parameter>
<parameter>
<name>removeAbandonedTimeout</name>
<value>60</value>
</parameter>
<parameter>
<name>password</name> <!--密码-->
<value>12345</value>
</parameter>
</ResourceParams>
</Context>

2.打开工程下的WEB-INF/web.xml,添加如下部分:
<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/wapOracle</res-ref-name> <!--这里name的值也必须与server.xml中的Resource里的
name的值相同-->
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>

3.然后写连接数据库的语句:
package util;

import java.sql.*;
import javax.sql.*;
import javax.naming.*;

public class OracleDB {
String url_ = "192.168.1.41:1521:gxcring";
//String url_ = "172.18.51.101:1521:SUNDB";
String id_ = "cms_user";
String pass_ = "12345";

Connection conn = null;
Statement stmt = null;

public OracleDB() {
try {
//Class.forName("oracle.jdbc.driver.OracleDriver");
//conn = DriverManager.getConnection("jdbc:oracle:thin:@" + url_, id_, pass_);
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
DataSource ds = (DataSource) envContext.lookup("jdbc/wapOracle"); //注意这里的名字与配置文件
里的名字相同就行了。
conn = ds.getConnection();

stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_UPDATABLE);
} catch (NamingException ne) {
System.out.println("Initial DataSource error.");
ne.printStackTrace();
} catch (SQLException e) {
System.out.println("ORACLE: " + e);
e.printStackTrace();
}
}

/**
* 返回Connction对象
* @param none
* @return Connction
*/
public Connection getConn() {
return this.conn;
}
}

另外参见:http://blog.csdn.net/nhy520/archive/2008/07/13/2645323.aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: