继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

大吉大利今晚学习
关注TA
已关注
手记 265
粉丝 36
获赞 142

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

?


/** * 连接池类 */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<Connection, Boolean> 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<Connection, Boolean>();      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<Connection, Boolean> 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连接池类,希望大家喜欢,谢谢大家的关注。

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP