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

      对于大型网站来说,信息查询的次数会非常多,每次查询都需要这样的过程:加载驱动程序、创建连接、创建语句对象、执行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

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值