用于App服務(wù)端的MySQL連接池(支持高并發(fā))
本文向大家介紹了簡(jiǎn)單的MySQL連接池,用于App服務(wù)端比較合適,分享給大家供大家參考,具體內(nèi)容如下
/**
* 連接池類(lè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è)試類(lèi)
*/
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連接池類(lèi),希望大家喜歡,謝謝大家的關(guān)注。
- MySQL mysqladmin客戶端的使用簡(jiǎn)介
- MySQL 如何連接對(duì)應(yīng)的客戶端進(jìn)程
- 解決MySql客戶端秒退問(wèn)題(找不到my.ini)
- PHP Swoole異步MySQL客戶端實(shí)現(xiàn)方法示例
- 解決Node.js mysql客戶端不支持認(rèn)證協(xié)議引發(fā)的問(wèn)題
- mysql8.0.11客戶端無(wú)法登陸的解決方法
- mysql/Java服務(wù)端對(duì)emoji的支持與問(wèn)題解決方法詳解
- 初識(shí)NodeJS服務(wù)端開(kāi)發(fā)入門(mén)(Express+MySQL)
- 解讀MySQL的客戶端和服務(wù)端協(xié)議
相關(guān)文章
計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn) mysql alter命令
這篇文章主要為大家詳細(xì)介紹了計(jì)算機(jī)二級(jí)考試MySQL知識(shí)點(diǎn),詳細(xì)介紹了mysql中alter命令的使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
MySQL索引背后的之使用策略及優(yōu)化(高性能索引策略)
MySQL的優(yōu)化主要分為結(jié)構(gòu)優(yōu)化(Scheme optimization)和查詢優(yōu)化(Query optimization)。本章討論的高性能索引策略主要屬于結(jié)構(gòu)優(yōu)化范疇2012-01-01
教你用eclipse連接mysql數(shù)據(jù)庫(kù)
這篇文章主要介紹了教你用eclipse連接mysql數(shù)據(jù)庫(kù),文中有非常詳細(xì)的圖文示例,對(duì)不會(huì)鏈接mysql的小伙伴們有很大的幫助,需要的朋友可以參考下2021-04-04
關(guān)于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解)
這數(shù)據(jù)庫(kù)應(yīng)用是一個(gè)應(yīng)用系統(tǒng)不可或缺的部分,關(guān)系型數(shù)據(jù)庫(kù)應(yīng)用大同小異,這里選擇MySQL作為數(shù)據(jù)庫(kù)平臺(tái)。下面通過(guò)本文給大家介紹關(guān)于Win10下MySQL5.7.17免安裝版基本配置教程(圖文詳解),需要的朋友可以參考下2017-06-06

