JDBC(四) 数据库连接池
来源:互联网 发布:linux可以做什么 编辑:程序博客网 时间:2024/05/21 09:48
数据库连接池
在程序中,每次直接去获取数据库连接,然后用完再释放,由于数据库创建连接需要消耗较多的资源,这里希望连接得到重用,采用数据库连接池的方案来解决这个问题,这也是池化思想的运用。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能
数据库连接池主要考虑到的因素有:
1. 最小连接数
是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。
2. 最大连接数
是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。
3. 最小连接数与最大连接数差距
最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
DBCP数据库连接池
很多web服务器都提供了DataSource的实现,即数据库连接池的实现,通常把DataSource的实现称为数据源,数据源包含了连接池的实现,例如dbcp就是java.sql.datasource接口的一种具体实现。也有开源组织提供的数据库连接池的独立实现:DBCP和C3P0,使用这些数据库连接池,不需要手动编写连接代码,只需要获取连接即可,方便,高效。
使用DBCP数据库连接池需要导入两个JAR包,commons-dbcp-1.2.2.jar、commons-pool.jar
在类目录下添加配置文件dbcp.properties
dbcp.properties:
#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/testjdbcusername=rootpassword=root#<!-- 初始化连接数 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接数 -->maxIdle=20#<!-- 最小空闲连接数 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 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)。#可用值为下列之一:NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=READ_UNCOMMITTED
JdbcUtilsWithDBCP.java
package com.aaa.utils;import java.io.IOException;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import org.apache.commons.dbcp.BasicDataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class JdbcutilsWithDBCP { private static BasicDataSource basicDataSource = null; // 在静态代码块中初始化数据库连接池 static { try { InputStream inputStream = JdbcutilsWithDBCP.class.getClassLoader() .getResourceAsStream("dbcp.properties"); Properties properties = new Properties(); properties.load(inputStream); // 数据源工厂创建数据源 basicDataSource = (BasicDataSource) BasicDataSourceFactory .createDataSource(properties); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static synchronized Connection getConnection() { try { return basicDataSource.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void relesaeDB(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) { if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
c3p0数据库连接池
使用c3p0数据库连接池需要导入jar包 c3p0-0.9.2-pre1.jar、mchange-commons-0.2.jar
在类目录下添加C3P0的配置文件:c3p0-config.xml
c3p0-config.xml:
<?xml version="1.0" encoding="UTF-8"?><c3p0-config><default-config> <!--默认配置--> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/databasename</property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> <property name="maxStatements">0</property> <property name="maxStatementsPerConnection">5</property> </default-config> <named-config name="mysql"> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/testjdbc </property> <property name="user">root</property> <property name="password">root</property> <property name="acquireIncrement">5</property> <property name="initialPoolSize">10</property> <property name="minPoolSize">5</property> <property name="maxPoolSize">20</property> <property name="maxStatements">20</property> <property name="maxStatementsPerConnection">5</property> </named-config></c3p0-config>
JdbcUtilsWithC3P0.java:
package com.aaa.utils;import java.io.InputStream;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Properties;import com.mchange.v2.c3p0.ComboPooledDataSource;public class JdbcUtilsWithC3P0 { private static ComboPooledDataSource comboPooledDataSource = null; static { try { InputStream inputStream = JdbcUtilsWithC3P0.class.getClassLoader() .getResourceAsStream("c3p0-config.xml"); Properties properties = new Properties(); properties.load(inputStream); // 配置文件可以用properties文件,也可以用xml,这里使用xml配置,(要放在类路径下) // comboPooledDataSource = new ComboPooledDataSource(); // 使用默认配置 // 指定配置 comboPooledDataSource = new ComboPooledDataSource("mysql"); } catch (Exception e) { // TODO: handle exception } } public static synchronized Connection getConnection() { try { return comboPooledDataSource.getConnection(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } public static void relesaeDB(Connection connection, PreparedStatement preparedStatement, ResultSet resultSet) { if (connection != null) { try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (preparedStatement != null) { try { preparedStatement.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (resultSet != null) { try { resultSet.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
- JDBC(四) 数据库连接池
- JDBC(九)数据库连接池
- JDBC连接技术(四):与各版本数据库连接方式
- Java jdbc数据库连接池总结(转)
- tomcat.jdbc.pool(数据库连接池)
- JDBC----数据库连接池(connection pool)
- JDBC学习(二)数据库连接池
- JDBC(11)—数据库连接池
- JDBC 数据库连接池(DBCP、C3P0) 详解
- JDBC笔记(三)数据库连接池
- JDBC数据库连接池
- jdbc数据库连接池
- JDBC---数据库连接池
- JDBC数据库连接池
- JDBC数据库连接池配置
- JDBC-数据库连接池dbcp
- JDBC数据库连接池总结
- JDBC数据库连接池
- 6、SERVLET API中forward() 与redirect()的区别?
- MyISAM和InnoDB的区别
- Python初识
- 2016.7.14纪中比赛总结
- codeforces 706C 简单dp
- JDBC(四) 数据库连接池
- hdu 5650
- 2016.7.13纪中比赛总结
- FZU 2147 A-B Game(数学推导题)
- HDU 5831 Rikka with Parenthesis II 2016 Multi-University Training Contest 8
- tjut 2870
- 安装sparklyr包过程中遇到的几个ERROR
- HDU-5831-Rikka with Parenthesis II-括号匹配
- hdu 2588 GCD-欧拉函数