Tomcat容器默认自带了dbcp连接池 用之

下面方法是针对单一项目的连接池配置,全局配置请自行百度。
以下操作之前一定要将mysql的jdbc添加到lib中

在/META-INF中创建context.xml并插入以下内容

name可以自行取名,相关参数请自行修改

<?xml version="1.0" encoding="UTF-8"?>
<Context debug="5" reloadable="true">
<Resource
name="jdbc/mysql"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
maxWait="10000"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://***.***.***.***/test?autoReconnect=true"/>
</Context>


需要注意的是,在xml配置文件中,url中的&符号需要转义。比如在tomcat的server.xml中配置数据库连接池时,mysql jdbc url样例如下:

jdbc:mysql://***.***.***.***:3306/test?characterEncoding=utf8
&amp;amp;autoReconnect=true&amp;amp;failOverReadOnly=false

在/WEB-INF/web.xml中添加如下内容

<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>

最后使用类似下面的方式,只需要调用getConn()方法即可获取连接

static DataSource ds;
static {
  Context c;
  try {
    c = new InitialContext();
    ds = (DataSource)c.lookup("java:comp/env/jdbc/mysql");
  } catch (NamingException e) {
    System.err.println("数据库连接创建戳无");
    e.printStackTrace();
  }
}
/**
* 建立连接,并返回connection
* @return connection
* @throws SQLException
*/
public static Connection getConn() throws SQLException {
  Connection conn = ds.getConnection();
  return conn;
}

解决Mysql8小时自动断开空闲连接的方法:

设置参考:DB的context.xml文件,添加后下面5行属性。
参数设置:参考官网 http://commons.apache.org/dbcp/configuration.html

<?xml version="1.0" encoding="UTF-8"?>
<Context reloadable="true" antiResourceLocking="false">
    <Resource name="jdbc/dbname"
        auth="Container"
        type="javax.sql.DataSource"
        driverClassName="com.mysql.jdbc.Driver"
        url="jdbc:mysql://***.***.***.***/test?autoReconnect=true"
        username="******"
        password="******"
        maxActive="500"
        maxIdle="30"
        maxWait="10000"
        validationQuery = "SELECT 1"  
        testWhileIdle = "true"    
        timeBetweenEvictionRunsMillis = "3600000"  
        minEvictableIdleTimeMillis = "18000000"
        testOnBorrow = "true"/>

</Context>

参数解释:
validationQuery
SQL查询语句,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录
testOnBorrow true
指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
testWhileIdle false
指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串
一种推荐的高效的方式是:将testOnBorrow设置为false,而将“testWhileIdle”设置为true,再设置好testBetweenEvictionRunsMillis值(小于8小时)。那些被mysql关闭的连接就可以别清除出去,避免“8小时问题”。

非常不推荐修改mysql的配置文件,MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到MySQL Server处理完相应的操作后,应该断开连接并释放占用的内存。如果你的MySQL Server有大量的闲置连接,他们不仅会白白消耗内存,而且如果连接一直在累加而不断开,最终肯定会达到MySQL Server的连接上限数,这会报'too many connections'的错误。对于wait_timeout的值设定,应该根据系统的运行情况来判断。在系统运行一段时间后,可以通过show processlist命令查看当前系统的连接状态,如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小些。下面的内容可以修改mysql配置,用来测试连接池效果是个不错的选择...

mysql> set global wait_timeout=300 ,interactive_timeout=300;
退出 重新登录。。
mysql> show variables like '%timeout%';

发现错误之处请指点0.0

原创文章采用 CC BY-NC-SA 4.0协议 进行许可,转载请著名转自: jsp中使用数据库连接池

2 评论

  1. cbam 5月22日 回复

    通过装配bean的方式向Dao实现类中注入SqlSessionFactory工厂,那儿体现了所谓的连接池技术啊? 哪儿有啥最大连接数 最小连接数啊

    1. z4zr 7月18日 回复

      回复 cbam: maxActive maxIdle