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