zoukankan      html  css  js  c++  java
  • java实现数据库连接池

    package nju.iip.dao;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.concurrent.ConcurrentHashMap;
    
    import nju.iip.util.Config;
    
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    /**
     * 连接池类
     * 
     * @author wangqiang
     * 
     */
    public class ConnectionPool {
    
        private static final Logger logger = LoggerFactory.getLogger(ConnectionPool.class);
    
        private int max_connection = Integer.valueOf(Config.getValue("max_connection"));// 最大连接数
    
        private int min_connection = Integer.valueOf(Config.getValue("min_connection"));// 最小连接数
    
        private Map<Connection,String> connection_map;// 存放连接池的容器
    
        private static ConnectionPool connectPool;// 单例
        
        private int waitTime = 100;
    
        private ConnectionPool() {
            logger.info("创建连接池....");
            intializePool();
            logger.info("创建连接池成功....共"+connection_map.size()+"个连接");
        }
    
        /**
         * 获取连接池单例
         * 
         * @return connectPool
         */
        public static ConnectionPool getInstance() {
            if (connectPool == null) {
                synchronized (ConnectionPool.class) {
                    if (connectPool == null) {
                        connectPool = new ConnectionPool();
                    }
                }
            }
            return connectPool;
        }
    
        public void intializePool() {
            if (connection_map != null) {
                return;
            }
            connection_map = new ConcurrentHashMap<Connection,String>();
            try {
                for (int i = 0; i < min_connection; i++) {
                    connection_map.put(getNewConnection(),"free");
                }
            } catch (Exception e) {
                logger.info("intializePool error", e);
            }
        }
    
        public Connection getNewConnection() {
            Connection conn = null;
            try {
                Class.forName(Config.getValue("DBDRIVER"));
                conn = DriverManager.getConnection(Config.getValue("DBURL"), Config.getValue("DBUSER"),Config.getValue("DBPASSWORD"));
            } catch (Exception e) {
                logger.info("getNewConnection error", e);
            }
            return conn;
        }
    
        /**
         * 获取一个连接
         * @return
         */
        public  Connection getConnection() {
            Connection conn = null;
            for (Entry<Connection, String> entry : connection_map.entrySet()) {
                if (entry.getValue().equals("free")) {
                    conn = entry.getKey();
                    connection_map.put(conn,"busy");
                    break;
                }
            }
            if (conn == null) {
                if (connection_map.size() <max_connection) {
                    conn = getNewConnection();//新建一个连接
                    connection_map.put(conn,"busy");
                    logger.info("no free connection,add new connection ok!");
                } 
                else {
                    logger.info("reach max_connction!start watting...");
                    wait(waitTime);
                    conn = getConnection();
                }
            }
            return conn;
        }
        
    
        /**
         * 释放连接
         * @param myconnection
         */
        public synchronized void releaseConnection(Connection conn) {
            if(conn == null) {
                return;
            }
             try{
                 if(connection_map.containsKey(conn)) {
                     if(conn.isClosed()) {
                         connection_map.remove(connectPool);
                     }
                     else{
                         connection_map.put(conn,"free");   
                         logger.info("releaseConnection ok...");
                     }
                 } 
                 else {
                     conn.close();
                 }
             }catch(Exception e){
                 logger.info("releaseConnection error", e);
             }
         }
        
        public void wait(int waitTime) {
            try{
                Thread.sleep(waitTime);
            }catch(Exception e){
                logger.info("wait error", e);
            }
        }
    
    }
  • 相关阅读:
    在wepy里面使用redux
    使用es6的蹦床函数解决递归造成的堆栈溢出
    解决layui下拉选择框只能选择不能手动输入文字
    POJ 2230 Watchcow (欧拉回路)
    POJ 2337 Catenyms (欧拉回路)
    POJ 2513 Colored Sticks (欧拉回路 + 字典树 +并查集)
    HDU 3018 Ant Trip (欧拉回路)
    HDU 1023 Train Problem II (大数卡特兰数)
    HDU 2067 小兔的棋盘 (卡特兰数)
    HDU 3584 Cube (三维数状数组)
  • 原文地址:https://www.cnblogs.com/mrpod2g/p/4998478.html
Copyright © 2011-2022 走看看