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