用于App服务端的MySQL连接池(支持高并发)

本文向大家介绍了简单的MySQL连接池,用于App服务端比较合适,分享给大家供大家参考,具体内容如下 /* 连接池类 */package com.junones.test; import java.sql.Connection;import java.sql.SQLException;im

                        <p>本文向大家介绍了简单的MySQL连接池,用于App服务端比较合适,分享给大家供大家参考,具体内容如下</p>

/**

  • 连接池类 */ package com.junones.test;

import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

public class MySQLPool { private static volatile MySQLPool pool; private MysqlDataSource ds; private Map map;

private String url = "jdbc:mysql://localhost:3306/test"; private String username = "root"; private String password = "root1234"; private int initPoolSize = 10; private int maxPoolSize = 200; private int waitTime = 100;

private MySQLPool() { init(); }

public static MySQLPool getInstance() { if (pool == null) { synchronized (MySQLPool.class) { if(pool == null) { pool = new MySQLPool(); } } } return pool; }

private void init() { try { ds = new MysqlDataSource(); ds.setUrl(url); ds.setUser(username); ds.setPassword(password); ds.setCacheCallableStmts(true); ds.setConnectTimeout(1000); ds.setLoginTimeout(2000); ds.setUseUnicode(true); ds.setEncoding("UTF-8"); ds.setZeroDateTimeBehavior("convertToNull"); ds.setMaxReconnects(5); ds.setAutoReconnect(true); map = new HashMap(); for (int i = 0; i < initPoolSize; i++) { map.put(getNewConnection(), true); } } catch (Exception e) { e.printStackTrace(); } }

public Connection getNewConnection() { try { return ds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; }

public synchronized Connection getConnection() { Connection conn = null; try { for (Entry entry : map.entrySet()) { if (entry.getValue()) { conn = entry.getKey(); map.put(conn, false); break; } } if (conn == null) { if (map.size() < maxPoolSize) { conn = getNewConnection(); map.put(conn, false); } else { wait(waitTime); conn = getConnection(); } } } catch (Exception e) { e.printStackTrace(); } return conn; }

public void releaseConnection(Connection conn) { if (conn == null) { return; } try { if(map.containsKey(conn)) { if (conn.isClosed()) { map.remove(conn); } else { if(!conn.getAutoCommit()) { conn.setAutoCommit(true); } map.put(conn, true); } } else { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }

/**

  • 测试类 */ package com.junones.test;

import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement;

public class TestMySQLPool { private static volatile int a;

private synchronized static void incr() { a++; }

public static void main(String[] args) throws InterruptedException { int times = 10000; long start = System.currentTimeMillis(); for (int i = 0; i < times; i++) { new Thread(new Runnable() {

    @Override
    public void run() {

      MySQLPool pool = MySQLPool.getInstance();
      Connection conn = pool.getConnection();
      Statement stmt = null;
      ResultSet rs = null;
      try {
        stmt = conn.createStatement();
        rs = stmt.executeQuery("select id, name from t_test");
        while (rs.next()) {
          System.out.println(rs.getInt(1) + ", "
              + rs.getString(2));
        }
      } catch (SQLException e) {
        e.printStackTrace();
      } finally {
        incr();
        if (rs != null) {
          try {
            rs.close();
          } catch (SQLException e) {
            e.printStackTrace();
          }
        }
        if (stmt != null) {
          try {
            stmt.close();
          } catch (SQLException e) {
          }
        }
        pool.releaseConnection(conn);
      }
    }
  }).start();
}
while (true) {
  if (a == times) {
    System.out.println("finished, time:"
        + (System.currentTimeMillis() - start));
    break;
  }
  Thread.sleep(100);
}

} }

测试结果:1万个并发,5秒完成。

以上就是为大家分享的MySQL连接池类,希望大家喜欢,谢谢大家的关注。