加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 03:14:14 所属栏目:Java 来源:网络整理
导读:今天PHP站长网 52php.cn把收集自互联网的代码分享给大家,仅供参考。 简单的MySQL连接池,用于App服务端比较合适 /** * 连接池类 */package com.junones.test;import java.sql.Connection;import java.sql.SQLException;i

以下代码由PHP站长网 52php.cn收集自互联网

现在PHP站长网小编把它分享给大家,仅供参考

简单的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秒完成。

以上内容由PHP站长网【52php.cn】收集整理供大家参考研究

如果以上内容对您有帮助,欢迎收藏、点赞、推荐、分享。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读