Tomcat 7 自帶數據庫連接池 Tomcat jdbc pool 使用示例

jopen 12年前發布 | 71K 次閱讀 Tomcat 7 數據庫連接池

Tomcat 在 7.0 以前的版本都是使用 commons-dbcp 做為連接池的實現,但是 dbcp 飽受詬病,原因有:

  • dbcp 是單線程的,為了保證線程安全會鎖整個連接池
  • dbcp 性能不佳
  • dbcp 太復雜,超過 60 個類
  • dbcp 使用靜態接口,在 JDK 1.6 編譯有問題
  • dbcp 發展滯后
  • 因此很多人會選擇一些第三方的連接池組件,例如 c3p0 , bonecp, druid 等。
  • </ul>

    為此,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 的優點遠不止這些,詳情請看這里。
    • </ul>

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

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!