最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

用于App服務(wù)端的MySQL連接池(支持高并發(fā))

 更新時(shí)間:2021年05月10日 14:12:27   投稿:lijiao  
這篇文章主要介紹了用于App服務(wù)端的MySQL連接池,并支持高并發(fā),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文向大家介紹了簡(jiǎn)單的MySQL連接池,用于App服務(wù)端比較合適,分享給大家供大家參考,具體內(nèi)容如下

/**
 * 連接池類
 */
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();
    }
  }
}
 
/**
 * 測(cè)試類
 */
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);
    }
  }
}

測(cè)試結(jié)果:1萬(wàn)個(gè)并發(fā),5秒完成。

以上就是為大家分享的MySQL連接池類,希望大家喜歡,謝謝大家的關(guān)注。

相關(guān)文章

  • MySQL的多版本并發(fā)控制MVCC的實(shí)現(xiàn)

    MySQL的多版本并發(fā)控制MVCC的實(shí)現(xiàn)

    MVCC就是多版本并發(fā)控制,本文主要介紹了MySQL的多版本并發(fā)控制MVCC的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • 透徹理解Mysql連接的原理

    透徹理解Mysql連接的原理

    這篇文章主要為大家介紹了Mysql連接原理的深入理解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • MySQL四種日志binlog/redolog/relaylog/undolog詳解

    MySQL四種日志binlog/redolog/relaylog/undolog詳解

    undo?log主要存儲(chǔ)的也是邏輯日志,比如我們要insert一條數(shù)據(jù)了,那undo?log會(huì)記錄的一條對(duì)應(yīng)的delete日志,我們要update一條記錄時(shí),它會(huì)記錄一條對(duì)應(yīng)相反的update記錄,這篇文章主要介紹了MySQL四種日志binlog/redolog/relaylog/undolog,需要的朋友可以參考下
    2024-08-08
  • MySQL學(xué)習(xí)之?dāng)?shù)據(jù)更新操作詳解

    MySQL學(xué)習(xí)之?dāng)?shù)據(jù)更新操作詳解

    這篇文章我們將學(xué)習(xí)一下用于數(shù)據(jù)更改的 “UPDATE” 語(yǔ)句, “UPDATE” 語(yǔ)句也是屬于 DML 這一類數(shù)據(jù)庫(kù)操作語(yǔ)言,感興趣的可以了解一下
    2022-08-08
  • MySQL幾點(diǎn)重要的性能指標(biāo)計(jì)算和優(yōu)化方法總結(jié)

    MySQL幾點(diǎn)重要的性能指標(biāo)計(jì)算和優(yōu)化方法總結(jié)

    下面小編就為大家?guī)?lái)一篇MySQL幾點(diǎn)重要的性能指標(biāo)計(jì)算和優(yōu)化方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-03-03
  • MySQL索引的各種類型

    MySQL索引的各種類型

    這篇文章主要介紹了MySQL索引的各種類型,幫助大家更好的理解和學(xué)習(xí)MySQL索引,感興趣的朋友可以了解下
    2020-09-09
  • MySQL InnoDB MRR優(yōu)化指南

    MySQL InnoDB MRR優(yōu)化指南

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB MRR優(yōu)化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 分享幾道關(guān)于MySQL索引的重點(diǎn)面試題

    分享幾道關(guān)于MySQL索引的重點(diǎn)面試題

    這篇文章主要給大家介紹了幾道關(guān)于MySQL索引的重點(diǎn)面試題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • mysql使用物理備份安裝xtrabackup的詳細(xì)過(guò)程

    mysql使用物理備份安裝xtrabackup的詳細(xì)過(guò)程

    這篇文章主要介紹了mysql使用物理備份安裝xtrabackup的詳細(xì)過(guò)程,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-05-05
  • Slave memory leak and trigger oom-killer

    Slave memory leak and trigger oom-killer

    這篇文章主要介紹了Slave memory leak and trigger oom-killer,需要的朋友可以參考下
    2016-07-07

最新評(píng)論

潮州市| 济南市| 东宁县| 杨浦区| 岐山县| 忻城县| 佳木斯市| 民乐县| 天柱县| 高清| 东乡县| 丰原市| 张家川| 临泉县| 肥东县| 上蔡县| 铜梁县| 阜新| 虎林市| 永新县| 罗山县| 岳阳市| 简阳市| 龙州县| 贵港市| 潜江市| 桂阳县| 嘉祥县| 孝感市| 贵港市| 青岛市| 库尔勒市| 诸暨市| 夏河县| 鲁甸县| 汉源县| 葫芦岛市| 化隆| 平阴县| 盈江县| 常德市|