欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

简单的MySQL连接池,支持高并发。,mysql连接支持并发,简单的MySQL连接池,

来源: javaer 分享于  点击 21609 次 点评:137

简单的MySQL连接池,支持高并发。,mysql连接支持并发,简单的MySQL连接池,


简单的MySQL连接池,用于App服务端比较合适```java/* * 连接池类 /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秒完成。

```

相关栏目:

用户点评