`

Tomcat自带连接池应用【转】

阅读更多

tomcat6.0连接mysql数据库连接池[原创]

1 下载Tomcat最新版本
下载地址:http://tomcat.apache.org/
2 下载mysql最新版本以及最近版本的驱动程序
下载地址:http://dev.mysql.com/downloads
http://dev.mysql.com/downloads/connector
并将下载的mysql-connector-java-5.1.0-bin.jar a连接文件放到$CATALINA_HOME/lib/下。
3 安装mysql数据库
4 创建一个tomcat应用程序,工程的名字为DBTest
5 修改$CATALINA_HOME/conf/ context.xml为以下内容
<Context path="/DBTest" docBase="DBTest"
        debug="5" reloadable="true" crossContext="true">
    <!-- maxActive: Maximum number of dB connections in pool. Make sure you configure your mysqld max_connections large enough to handle
         all of your db connections. Set to 0 for no limit.
         -->
    <!-- maxIdle: Maximum number of idle dB connections to retain in pool.
         Set to -1 for no limit.  See also the DBCP documentation on this
         and the minEvictableIdleTimeMillis configuration parameter.
         -->
    <!-- maxWait: Maximum time to wait for a dB connection to become available
         in ms, in this example 10 seconds. An Exception is thrown if
         this timeout is exceeded.  Set to -1 to wait indefinitely.
         -->
    <!-- username and password: MySQL dB username and password for dB connections  -->
    <!-- driverClassName: Class name for the old mm.mysql JDBC driver is
         org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
         Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
         -->
       <!-- url: The JDBC connection url for connecting to your MySQL dB.
         The autoReconnect=true argument to the url makes sure that the
         mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
         connection.  mysqld by default closes idle connections after 8 hours.
         -->
  <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
               maxActive="100" maxIdle="30" maxWait="10000"
               username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
               url="jdbc:mysql://localhost:3306/ jtest?autoReconnect=true"/>

</Context>
此时要注意修改自己的数据库的用户名和密码
我建立的
数据库:jtest
用户名:javauser
密码:javadude
6 修改工程目录下的web.xml文件添加如下
<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>
7 创建一个java类
package com.test;

/*
* DBTest.java
*
* Created on 2007/06/07, 10:33:02
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/

/**
*
* @author wangzicai
*/
import javax.naming.*;
import javax.sql.*;
import java.sql.*;
public class DBTest {
    String foo = "Not Connected";
    int bar = -1;
    public void init() {
        try{
            Context ctx = new InitialContext();
            if(ctx == null )
                throw new Exception("Boom - No Context");
            DataSource ds =
                    (DataSource)ctx.lookup(
                    "java:comp/env/jdbc/TestDB");
            if (ds != null) {
                Connection conn = ds.getConnection();
                if(conn != null) {
                    foo = "Got Connection "+conn.toString();
                    Statement stmt = conn.createStatement();
                    ResultSet rst =
                            stmt.executeQuery(
                            " select * from test ");
                    if(rst.next()) {
                        foo=rst.getString(1);
                        bar=208;
                    }
                    conn.close();
                }
            }
        }catch(Exception e) {
            e.printStackTrace();
        }
    }
    public String getFoo() { return foo; }
    public int getBar() { return bar;}
}



8 编辑index.jsp


<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import ="com.test.*" %>
<html>
<head>
<title>DB Test</title>
</head>
<body>
<%
DBTest tst = new DBTest();
tst.init();
%>
<h2>Results</h2>
Foo <%= tst.getFoo() %><br>
Bar <%= tst.getBar() %>
</body>
</html>
9 部署测试

 

================参数说明=========================

maxActive="5"

表示并发情况下最大可从连接池中获取的连接数。如果数据库不是单独,供一个应用使用,通过设置maxActive参数可以避免某个应用无限制的获取连接对其他应用造成影响,如果一个数据库只是用来支持一个应用那么maxActive理论上可以设置成该数据库可以支撑的最大连接数。maxActive只是表示通过连接池可以并发的获取的最大连接数。

从图上我们可以看到连接的获取与释放是双向,当应用程序并发请求连接池时,连接池就需要从数据库获取连接,那么但应用程序使用完连接并将连接归还给连接池时,连接池是否也同时将连接归还给数据库呢?很显然答案是否定的,如果那样的话连接池就变得多此一举,不但不能提高性能,反而会降低性能,那么但应用成归还连接后,连接池如何处理呢?

maxIdle="3"

如果在并发时达到了maxActive=5,那么连接池就必须从数据库中获取5个连接来供应用程序使用,当应用程序关闭连接后,由于maxIdle=3,因此并不是所有的连接都会归还给数据库,将会有3个连接保持在连接池种中,状态为空闲。

minIdle=2

最小默认情况下并不生效,它的含义是当连接池中的连接少有minIdle,系统监控线程将启动补充功能,一般情况下我们并不启动补充线程。

问题:如何设置maxActivemaxIdle

理论上讲maxActive应该设置成应用的最大并发数,这样一来即便是在最大并发的情况下,应用依然能够从连接池中获取连接,但是困难时的是我们很难准确估计到最大并发数,设置成最大并发数是一种最优的服务质量保证,事实上,如果某个用户登录提示系统繁忙,那么在他再次登录时,可能系统资源已经充足,对于拜特资金管理系统我们建议将maxActive设置为系统注册人数的十分之一到二十分之一之间。例如系统的注册人数为1000,那么设置成50-100靠近100的数字,例如8590

 maxIdle对应的连接,实际上是连接池保持的长连接,这也是连接池发挥优势的部分,理论上讲保持较多的长连接,在应用请求时可以更快的响应,但是过多的连接保持,反而会消耗数据库大量的资源,因此maxIdle也并不是越大越好,同上例我们建议将 maxIdle设置成

50-100中靠近50的数字,例如55。这样就能在兼顾最大并发同时,保持较少的数据库连接,而且在绝大多情况,能够为应用程序提供最快的相应速度。

 

testOnBorrow="true"

validationQuery="select count(*) from bt_user"

我们知道数据库连接从本质上架构在tcp/ip连接之上,一般情况下web服务器与数据库服务器都不在同一台物理机器上,而是通过网络进行连接,那么当建立数据库连接池的机器与数据库服务器自己出现网络异常时,保持在连接池中的连接将失效,不能够在次使用,传统的情况下只能通过重新启动,再次建立连接,通过设置以上两个参数,但应用程序从连接池中获取连接时,会首先进行活动性检测,当获取的连接是活动的时候才会给应用程序使用,如果连接失效,连接将释放该连接。validationQuery是一条测试语句,没有实际意义,现实中,一般用一条最为简单的查询语句充当。

 

removeAbandoned="true"

removeAbandonedTimeout="60"

logAbandoned="true"

有时粗心的程序编写者在从连接池中获取连接使用后忘记了连接的关闭,这样连池的连接就会逐渐达到maxActive直至连接池无法提供服务。现代连接池一般提供一种“智能”的检查,但设置了removeAbandoned="true"时,当连接池连接数到达(getNumIdle() < 2) and (getNumActive() > getMaxActive() - 3)时便会启动连接回收,那种活动时间超过removeAbandonedTimeout="60"的连接将会被回收,同时如果logAbandoned="true"设置为true,程序在回收连接的同时会打印日志。removeAbandoned是连接池的高级功能,理论上这中配置不应该出现在实际的生产环境,因为有时应用程序执行长事务,可能这种情况下,会被连接池误回收,该种配置一般在程序测试阶段,为了定位连接泄漏的具体代码位置,被开启,生产环境中连接的关闭应该靠程序自己保证。


分享到:
评论

相关推荐

    Tomcat连接池的配置

    本文将详细介绍如何配置Tomcat的连接池,即Catalina自带的`Apache Commons DBCP2`或`Apache Tomcat JDBC Pool`。 **一、Tomcat连接池的引入** Tomcat默认并未开启连接池,我们需要手动配置。首先,在Tomcat的`conf...

    java web项目配置tomcat连接池的那些搓事

    在Tomcat中,常用的连接池组件有Apache的DBCP、C3P0和Tomcat自带的Tomcat-jdbc。本篇博客可能主要介绍了Tomcat-jdbc的配置,因为它是Tomcat 7及以上版本的默认连接池实现,性能优秀且易于使用。 配置Tomcat连接池...

    tomcat配置数据库连接池

    二、Tomcat自带的连接池Catalina JDBC Connection Pool Tomcat 5.5及更高版本内置了Catalina JDBC Connection Pool(也称为Apache Commons DBCP),这是一个基于Apache Commons Pool和Apache Commons Database ...

    tomcat连接池配置

    2. **Tomcat连接池**:Tomcat自带了对连接池的支持,可以通过`Resource`标签在`context.xml`文件中进行配置。 #### 三、配置步骤 ##### 1. 添加Oracle JDBC驱动到Tomcat - 将Oracle JDBC驱动包(例如`ojdbc6.jar`...

    tomcat-jdbc-notes:Tomcat自带数据库连接池源码阅读

    当应用请求数据库连接时,Tomcat JDBC首先会从空闲连接池中获取一个连接。如果没有可用连接,它会根据配置的最小Idle值和最大Active值决定是否创建新的连接。连接使用完毕后,通过调用`close()`方法归还连接,实际...

    数据库连接池配置终极指南

    本文档将详细介绍如何在自安装的Tomcat服务器以及JBuilder自带的Tomcat中配置数据库连接池,确保开发与调试过程中的高效性。 #### 二、准备工作 1. **安装Tomcat** - 确保安装的Tomcat版本支持数据库连接池功能...

    Mysql+tomcat连接池自己的例子

    Tomcat自带了一个名为Apache Commons DBCP的连接池实现,我们可以通过修改服务器的配置文件来启用它。主要涉及的配置文件有`server.xml`和`context.xml`。 在`server.xml`文件中,我们通常不会直接配置数据源,而是...

    tomcat下面配置连接池

    除了使用Tomcat自带的连接池之外,还可以选择使用Apache Commons DBCP作为连接池。在Spring配置文件中定义数据源: ```xml **"/&gt; **"/&gt; ``` - **driverClassName**: Oracle JDBC驱动类名。 - **url**: ...

    自定义JDBC连接池及常用连接池介绍

    5. Tomcat JDBC Connection Pool:Tomcat服务器自带的连接池,适用于那些不希望引入额外依赖的项目。 这些连接池各有优缺点,选择时应考虑项目的具体需求,如性能、稳定性、易用性、功能特性等。了解和熟悉这些连接...

    c3p0 还有其他连接池

    4. **DBPool**:Tomcat自带的连接池实现,虽然功能相对简单,但与Tomcat集成方便,适用于小型项目。 每种连接池都有其特点和适用场景,选择合适的连接池需要考虑应用的规模、性能需求以及与现有框架的兼容性等因素...

    浅谈java连接池

    常见的Java连接池实现有Apache的DBCP、C3P0、HikariCP以及Tomcat的内置连接池等。选择合适的连接池依赖于应用程序的需求,如并发量、性能要求、稳定性等因素。正确的配置和使用连接池是提升Java应用程序性能、降低...

    web中常用数据库连接池

    5. Tomcat JDBC Connection Pool:Tomcat服务器自带的数据库连接池,它是一个完全符合JDBC 4.0规范的连接池实现,支持JNDI绑定和各种数据库驱动。 在使用数据库连接池时,我们需要关注以下几点: 1. 配置参数:...

    jdbc数据库连接池

    5. Tomcat JDBC Pool:Tomcat服务器自带的连接池,基于Jakarta-pool2实现。 ** 使用示例:HikariCP配置与使用 ** 在Spring框架中,可以使用以下配置来启用HikariCP连接池: ```xml &lt;!-- 其他配置属性...

    hibernate连接池之tomcat6的配置

    标题“hibernate连接池之tomcat6的配置”涉及到的是如何在Tomcat6服务器中配置Hibernate连接池,以便高效管理数据库连接。这通常是为了优化应用程序的性能和资源利用。以下将详细介绍相关知识点: 1. **Hibernate**...

    关于JDBC连接池的java类

    4. **Tomcat JDBC Connection Pool**:Tomcat自带的JDBC连接池,它的设计目标是轻量级、快速且易于使用。它提供了自动防泄漏、连接健康检查等功能。 使用JDBC连接池的步骤通常包括以下几步: 1. **引入依赖**:在...

    数据库连接池-jar包

    5. **Tomcat JDBC Connection Pool**:这是Apache Tomcat服务器自带的连接池,适合在Spring Boot等框架中使用。对应的jar包是`tomcat-jdbc.jar`。 这些jar包的使用通常涉及以下步骤: 1. **添加依赖**:在Maven或...

    j2ee开发连接池的配置

    - JNDI绑定:在应用服务器(如Tomcat、JBoss等)的配置文件中,将数据源绑定到JNDI名称,以便于应用通过JNDI查找和获取连接池。 - 应用程序集成:在J2EE应用中,通过JNDI查找并获取连接池,然后从连接池中获取和...

    数据连接池有用的jar包

    5. Tomcat JDBC Connection Pool:Tomcat服务器自带的连接池,适用于那些不希望引入额外依赖的项目。 引入这些jar包到项目中通常是通过Maven或Gradle等构建工具来完成的,只需在配置文件中添加相应的依赖,即可自动...

    JAVA 开发数据库连接池jar包

    5. Tomcat JDBC Connection Pool:Tomcat服务器自带的连接池,简单易用且性能良好。 三、如何在项目中引入jar包 在Java项目中,通常我们会使用构建工具如Maven或Gradle来管理依赖。对于上述提到的连接池,我们可以...

    一个Demo小例子让你了解数据库连接池实现的4种方式

    2. **JdbcTomcat(Apache Tomcat JDBC Connection Pool)**:Tomcat自带的数据库连接池,是Apache软件基金会的Jakarta Commons DBCP项目的升级版。它提供了更丰富的功能,如支持预编译的SQL语句(PreparedStatement...

Global site tag (gtag.js) - Google Analytics