zoukankan      html  css  js  c++  java
  • 使用 Tomcat 7 新的连接池 —— Tomcat jdbc pool

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

    1. dbcp 是单线程的,为了保证线程安全会锁整个连接池
    2. dbcp 性能不佳
    3. dbcp 太复杂,超过 60 个类
    4. dbcp 使用静态接口,在 JDK 1.6 编译有问题
    5. dbcp 发展滞后

    因此很多人会选择一些第三方的连接池组件,例如 c3p0 , bonecpdruid (@wenshao ) 等。

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

    1. tomcat jdbc pool 近乎兼容 dbcp ,性能更高
    2. 异步方式获取连接
    3. tomcat jdbc pool 是 tomcat 的一个模块,基于 tomcat JULI,使用 Tomcat 的日志框架
    4. 使用 javax.sql.PooledConnection 接口获取连接
    5. 支持高并发应用环境
    6. 超简单,核心文件只有8个,比 c3p0 还
    7. 更好的空闲连接处理机制
    8. 支持 JMX
    9. 支持 XA Connection

    tomcat jdbc pool 的优点远不止这些,详情请看这里

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

    Tomcat 中直接使用的方法:

    数据源配置:

          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 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) {}

    }

        }

    }

    以上只是简单的介绍,具体的使用方法还需参考:

    https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

    引自:http://www.oschina.net/question/12_36910

  • 相关阅读:
    J2SE API & J2EE API & SSH API
    JSP转发和重定向的区别
    Tomcat详解
    面试题:通过问题排查,考察测试链路熟练程度
    c语言中求数组的长度
    CGContextBeginPath
    CGContextAddAr绘制一个圆弧
    将当前的手机屏幕上的视图控件的view拍照 并保存到手的album中
    CGContextFillPath(ctx)
    CGContextSetRGBFillColor
  • 原文地址:https://www.cnblogs.com/zhwl/p/3736429.html
Copyright © 2011-2022 走看看