文档章节

使用 Tomcat 7 新的连接池 —— Tomcat jdbc pool

Sub
 Sub
发布于 2013/05/03 15:37
字数 524
阅读 1504
收藏 69

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有:

  • dbcp 是单线程的,为了保证线程安全会锁整个连接池
  • dbcp 性能不佳
  • dbcp 太复杂,超过 60 个类
  • dbcp 使用静态接口,在 JDK 1.6 编译有问题
  • dbcp 发展滞后
  • 因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecp, druid 等。

为此,Tomcat 从 7.0 开始引入一个新的模块:Tomcat jdbc pool

  • tomcat jdbc pool 近乎兼容 dbcp ,性能更高
  • 异步方式获取连接
  • tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
  • 使用 javax.sql.PooledConnection 接口获取连接
  • 支持高并发应用环境
  • 超简单,核心文件只有8个,比 c3p0 还
  • 更好的空闲连接处理机制
  • 支持 JMX
  • 支持 XA Connection
  • tomcat jdbc pool 的优点远不止这些,详情请看这里。

tomcat jdbc pool 可在 Tomcat 中直接使用,也可以在独立的应用中使用。

Tomcat 中直接使用的方法:

数据源配置:

<Resource name="jdbc/TestDB"
  auth="Container"
  type="javax.sql.DataSource"
  factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
  testWhileIdle="true"
  testOnBorrow="true"
  testOnReturn="false"
  validationQuery="SELECT 1"
  validationInterval="30000"
  timeBetweenEvictionRunsMillis="30000"
  maxActive="100"
  minIdle="10"
  maxWait="10000"
  initialSize="10"
  removeAbandonedTimeout="60"
  removeAbandoned="true"
  logAbandoned="true"
  minEvictableIdleTimeMillis="30000"
  jmxEnabled="true"
  jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"
  username="root"
  password="password"
  driverClassName="com.mysql.jdbc.Driver"
  url="jdbc:mysql://localhost:3306/mysql"/>

异步获取连接的方法:

Connection con = null;
try {
    Future < Connection > future = datasource.getConnectionAsync();
    while(!future.isDone()) {
        System.out.println("Connection is not yet available. Do some background work");
        try {
            Thread.sleep(100); //simulate work       
        }catch (InterruptedException x) {    
            Thread.currentThread().interrupted();       
        }   
    }   
    con = future.get(); //should return instantly   
    Statement st = con.createStatement();   
    ResultSet rs = st.executeQuery("select * from user");

在独立的应用中使用:

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;
public class SimplePOJOExample {
    public static void main(String[] args) throws Exception {
        PoolProperties p = new PoolProperties();
        p.setUrl("jdbc:mysql://localhost:3306/mysql");
        p.setDriverClassName("com.mysql.jdbc.Driver");
        p.setUsername("root");
        p.setPassword("password");
        p.setJmxEnabled(true);
        p.setTestWhileIdle(false);
        p.setTestOnBorrow(true);
        p.setValidationQuery("SELECT 1");
        p.setTestOnReturn(false);
        p.setValidationInterval(30000);
        p.setTimeBetweenEvictionRunsMillis(30000);
        p.setMaxActive(100);
        p.setInitialSize(10);
        p.setMaxWait(10000);
        p.setRemoveAbandonedTimeout(60);
        p.setMinEvictableIdleTimeMillis(30000);
        p.setMinIdle(10);
        p.setLogAbandoned(true);
        p.setRemoveAbandoned(true);
        p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;" + "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
        DataSource datasource = new DataSource();
        datasource.setPoolProperties(p);
        Connection con = null;
        try {
            con = datasource.getConnection();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("select * from user");
            int cnt = 1;
            while(rs.next()) {
                System.out.println((cnt++) + ". Host:" + rs.getString("Host") + " User:" + rs.getString("User") + " Password:" + rs.getString("Password"));
            }
            rs.close();
            st.close();
        } finally {
            if(con != null) try {
                con.close();
            } catch(Exception ignore) {}
        }
    }
}

© 著作权归作者所有

共有 人打赏支持
Sub

Sub

粉丝 123
博文 94
码字总数 22632
作品 5
浦东
架构师
私信 提问
加载中

评论(3)

sp42
sp42
非常好
Backflow
Backflow
看听起来不错,我试试看,,怎么和spring整合呢?
倪伟伟
倪伟伟
不错,学习一下。。。。
使用 Tomcat 7 新的连接池 —— Tomcat jdbc pool

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做为连接池的实现,但是 dbcp 饱受诟病,原因有: dbcp 是单线程的,为了保证线程安全会锁整个连接池 dbcp 性能不佳 dbcp 太复杂,超过 60 个...

红薯
2012/01/25
70.9K
24
Tomcat7 新的数据库连接池Tomcat jdbc pool介绍和配置

Tomcat 在 7.0 以前的版本都是使用commons-dbcp做为连接池的实现,但是 dbcp存在一些问题: (1)dbcp 是单线程的,为了保证线程安全会锁整个连接池 (2)dbcp 性能不佳 (3)dbcp 太复杂,超...

zkool
2013/04/13
0
0
c3p0、dbcp、tomcat jdbc pool 连接池区别

查看资料,得知dbcp和c3p0都是单线程的,在高并发的环境下性能会非常低下, 决定换用tomcat自带的jdbc-pool,关于jdbc-pool的项目介绍。 区别参考链接:http://www.open-open.com/lib/view/o...

张嘴吃药
2017/10/30
0
0
Java 连接池 Apache Commons DBCP 2.5.0 发布

Apache Commons DBCP 2.5.0 已发布,这是一个次要版本,主要包含 bug 修复和改进,并要求 Java 8 及以上以支持 JDBC 4.2 。 DBCP(Database Connection Pool)是一个依赖 Jakarta commons-pool...

王练
2018/07/17
1K
5
主流Java数据库连接池比较及前瞻

本文转载自微信公众号「工匠小猪猪的技术世界」 主流数据库连接池 常用的主流开源数据库连接池有C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid等 C3p0: 开源的JDBC连接池,实现了数据源和JND...

渣渣(Charles)
2018/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 孤独到都和病毒发生了感情了

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @-冰冰棒- :#今日歌曲推荐# 逃跑计划《一万次悲伤 (Live)》 《一万次悲伤 (Live)》- 逃跑计划 手机党少年们想听歌,请使劲儿戳(这里) 现在...

小小编辑
今天
45
8
test

//// main.c// Test//// Created by 吕颖 on 2019/1/16.// Copyright © 2019年 carmen. All rights reserved.//#include <stdio.h>#include <stdlib.h>#include <t......

carmen-ly
今天
3
0
Android webview热门组件agentweb:4.0.2无法自适应的问题

Android webview热门组件agentweb:4.0.2无法自适应的问题 //设置自适应屏幕,两者合用mAgentWeb.getAgentWebSettings().getWebSettings().setUseWideViewPort(true); //将图片调整到适合w...

Gemini-Lin
今天
5
0
如何维护一个自己的 golang doc 服务

本文内容是如何维护一个golang 在线的doc 服务。 1 什么是godoc ? godoc 是 golang 官方提供的文档生成工具, 2 为什么要有godoc ? 我们经常遇到一个问题,就是代码和文档不一致,线上代码版...

鼎铭
今天
5
0
js中的对象创建的模式以及继承模式

对象创建模式: 工厂模式 构造函数模式 原型模式 继承模式 原型式继承 寄生式继承 构造函数 原型式和构造函数的组合式(缺点:运行两次超类类函数,积累函数的属性被挂载在原型对象上和实例对...

莫西摩西
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部