一、为什么要使用数据库连接池技术:
假如一个网站每天的流量很大,每次访问都需要创建数据库连接对象。这样频繁的创建时非常的耗费系统资源的,容易造成服务器的内存溢出等等问题,会严重的影响到网站的性能。于是我们使用数据库连接池。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个连接对象。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中, 这些数据库连接的数量是由最小数据库连接数来设定的.无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量.连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中.
对数据库连接池设置时候的注意事项:
- 最小连接数是连接池一直保持的数据连接。如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费掉。
- 最大连接数是连接池能申请的最大连接数。如果数据连接请求超过此数,后面的数据连接请求将被加入到等待队列中,这会影响之后的数据库操作。
- 如果最小连接数与最大连接数相差太大,那么,最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
public class SimplePoolDemo { //创建一个连接池 private static LinkedList<Connection> pool = new LinkedList<Connection>(); //初始化10个连接 static{ try { for (int i = 0; i < 10; i++) { Connection conn = DBUtils.getConnection();//得到一个连接 pool.add(conn); } } catch (Exception e) { throw new ExceptionInInitializerError("数据库连接失败,请检查配置"); } } //从池中获取一个连接 public static Connection getConnectionFromPool(){ return pool.removeFirst();//移除一个连接对象 } //释放资源 public static void release(Connection conn){ pool.addLast(conn); } }
下面主要记录的是常用的两种数据库连接池 (DBCP 和 C3P0)
1、DBCP
首先下载三个 jar 文件,commons-dbcp-1.4.jar,commons-pool-1.5.6.jar,mysql-connector-java-5.0.8-bin.jar,加载到项目中去。
然后添加配置文件 .properities,见代码:
#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/test username=root password=123456 #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=utf8 #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=REPEATABLE_READ
public class MyDataSource { // 定义连接池对象 private static DataSource source = null; static { try { Properties propertie = new Properties(); // 读取配置文件 propertie.load(MyDataSource.class.getClassLoader().getResourceAsStream("DBConfig.properties")); // 获取连接池 source = BasicDataSourceFactory.createDataSource(propertie); } catch (Exception e) { e.printStackTrace(); } } // 关闭对象 并不是真的关闭 public static void closeAll(ResultSet rs, Statement stmt, Connection conn) throws SQLException { if (rs != null) { rs.close(); } if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } // 获取连接对象 public static Connection GetConn() throws SQLException { return source.getConnection(); } // 获取连接对象 public static DataSource GetDataSource() throws SQLException { return source; } }
代码下载: 点击下载
2、C3P0