数据库连接池--概述以及DBCP实现
1. 为什么要引入数据库连接池
应用程序直接获取连接的方式中,用户每次请求都需要向服务器获得连接,而服务器创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万的访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库服务器的资源,并且极易造成数据库服务器内存溢出,宕机.
2. 开源的数据库连接池
数据库连接池必须实现javax.sql.DataSource接口,并提供getConnection()方法.
DBCP 数据库连接池
是Apache软件基金会组织下的开源连接池的实现,使用DBCP数据源,应用程序应在系统中引入如下两个jar文件:
Commoms-dbcp.jar:连接池的实现
Commons-pool.jar:连接池实现的依赖
Tomcat的连接池正是采用该连接池实现的.该数据库连接池既可以与应用服务器整合应用,也可以由程序独立使用.
DBCP的核心类是BasicDataSource
下面使用两种方式演示使用BasicDataSource从数据库获取连接池的方法.注意需要在工程项目中导入Mysql JDBC驱动的jar包,保证可以获得数据库连接
第一种,在BasicDataSource类对象初始化时通过BasicDataSource自身的API对数据库连接以及连接池的一些属性进行设置.
import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSource; public class DBCPUtils { private static BasicDataSource dataSource = new BasicDataSource(); static{ //以下是创建数据库连接的基本设置 //类似于JDBC连接中注册驱动--->Class.forName("com.mysql.jdbc.Driver"); dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置JDBC中用于获取连接的参数--->Connection conn = DriverManager.getConnection(url,username,password); dataSource.setUrl("jdbc:mysql://localhost:3306/day17"); dataSource.setUsername("root"); dataSource.setPassword("fujianyi"); //以下是数据库连接池的设置 //设置数据库连接池的初始化连接数 dataSource.setInitialSize(10); //设置数据库连接池的最大活动数,数据库服务器所能承受的最大连接数 dataSource.setMaxActive(20); //设置数据库连接池在空闲时保持的最大连接数 dataSource.setMaxIdle(15); //设置数据库连接池在空闲时保持的最小连接数 dataSource.setMinIdle(5); } public static DataSource getDataSource(){ return dataSource; } }
第二种,使用BasicDataSourceFactory工厂类创建BasicDataSource连接池,并在创建连接时,将数据库连接以及连接池的属性通过配置文件的方式进行设置.注意在获取配置文件的路径,为当前工程的classpath,也就是src目录下保证配置文件的存在.
import java.io.InputStream; import java.util.Properties; import javax.sql.DataSource; import org.apache.commons.dbcp.BasicDataSourceFactory; public class DBCPUtils2 { private static DataSource dataSource; static{ try { Properties properties = new Properties(); InputStream in = DBCPUtils2.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"); properties.load(in); dataSource = BasicDataSourceFactory.createDataSource(properties); } catch (Exception e) { throw new RuntimeException(e); } } public static DataSource getDataSource(){ return dataSource; } }
以下是上述代码引用的配置文件dbcpconfig.properties的内容,里面是一些配置,同第一种方式的配置内容一样.
#连接设置 driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/day17 username=root password=fujianyi #<!-- 初始化连接 --> initialSize=10 #最大连接数量 maxActive=50 #<!-- 最大空闲连接 --> maxIdle=20 #<!-- 最小空闲连接 --> minIdle=5 #<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 --> maxWait=60000 #JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。 connectionProperties=useUnicode=true;characterEncoding=gbk #指定由连接池所创建的连接的自动提交(auto-commit)状态。 defaultAutoCommit=true #driver default 指定由连接池所创建的连接的只读(read-only)状态。 #如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix) defaultReadOnly= #driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。 #可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE defaultTransactionIsolation=READ_UNCOMMITTED