数据库连接池

连接池

  - 就是将Connection对象放入list中,反复重用。

  - 连接池的初始化:

    - 事先放入多个对象。

  - 从连接池中取连接对象

    - 如果池中有可用连接,则将池中最后一个返回,同时,将该连接从池中remove,表示正在使用。

    - 如果池中没有可用连接,则创建一个新的。

  - 关闭连接

    - 并不是真正的关闭连接,而是将用完的连接放入池中。

 

市场上常用的连接池产品

  - DBCP

  - c3p0

  - proxool

package com.yf.sorm.pool;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.yf.sorm.core.DBManager;

/**
 * 连接池的类
 * @author yangf
 *
 */
public class DBConnectionPool {
    
    /**
     * 连接池对象
     */
    private static List<Connection> pool;
    
    /**
     * 最大连接数
     */
    private static final int POOL_MAX_SIZE = DBManager.getConf().getPoolMaxSize();
    
    /**
     * 最小连接数
     */
    private static final int POOL_MIN_SIZE = DBManager.getConf().getPoolMinSize();
    
    /**
     * 初始化连接池,使池中的连接数达到最小值
     */
    public void initPool() {
        
        if(pool == null) {
            pool = new ArrayList<Connection>();
        }
        
        while(pool.size() < DBConnectionPool.POOL_MIN_SIZE) {
            pool.add(DBManager.createConnection());
        }
    }
    
    /**
     * 从连接池中取出一个连接
     * @return 取出的连接
     */
    public synchronized Connection getConnection() {
        // 获取最后一个连接的索引
        int last_index = pool.size() - 1;
        Connection connection = pool.get(last_index);
        pool.remove(last_index);
        return connection;
    }
    
    /**
     * 将连接放回池中
     * @param conn 连接
     */
    public synchronized void close(Connection conn) {
        if(pool.size() >= DBConnectionPool.POOL_MAX_SIZE) {
            try {
                if(conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        } else {
            pool.add(conn);
        }
    }
    
    public DBConnectionPool() {
        initPool();
    }
}

 

posted @ 2017-05-23 21:18  noooooob  阅读(122)  评论(0编辑  收藏  举报