数据库连接池
连接池
- 就是将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(); } }