首页 > 数据库 > MySQL > 正文

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

2024-07-24 13:08:40
字体:
来源:转载
供稿:网友
这篇文章主要介绍了用于App服务端的MySQL连接池,并支持高并发,感兴趣的小伙伴们可以参考一下
 

本文向大家介绍了简单的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连接池类,希望大家喜欢,谢谢大家的关注。



注:相关教程知识阅读请移步到MYSQL教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表