数据源概述
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个
应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而再不是重新建立一个;释放空闲时
间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。这项技术能明显提高对数据库操作的性能。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些
数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接
数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。数据库连接池的最小连接数和最大连接数的设
置要考虑到下列几个因素:
1) 最小连接数是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;
2) 最大连接数是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之
后的数据库操作。
3) 如果最小连接数与最大连接数相差太大,那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库
连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。
在spring框架中,与数据库的连接都是通过数据源来获取的,而数据源的配置一般都是使用数据连接池,只有获取了与数据库的通讯,才能进行数据的持久化,所以对于数据连接池,我在这里就概述一下我使用过的一些数据连接池。
1.DBCP数据源
DBCP类包为commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,所以还应包含commons-pool.jar,所以在使用DBCP之前,要先添加上面两个jar包依赖。
在spring配置文件中的引用
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 配置数据源 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!-- 最大连接数据库连接数 -->
<property name="maxActive" value="500" />
<!-- 最大等待连接中的数量 0标识没有限制 -->
<property name="maxIdle" value="10" />
<!-- 最大等待毫秒数 超时报错 -->
<property name="maxWait" value="500" />
<property name="defaultAutoCommit" value="true" />
<!-- 是否自我中断 -->
<property name="removeAbandoned" value="true" />
<property name="removeAbandonedTimeout" value="60" />
</bean>
上面的配置中,我只是根据项目需要,定义了其中一些属性,但DBCP还有更多的属性,下面我就贴出一个介绍属性比较全的博文,给大家补充下。
博文地址:http://www.cnblogs.com/adolfmc/archive/2013/01/22/2872298.html
2.Druid
由阿里出品的一款数据库连接池,内置了许多JDBC的组件,几乎兼容市面上所有主流的数据库,另外还特别对oracle和mysql进行了优化,个人认为,是属于数据库连接池中,比较全面的一个数据库连接池。
在spring配置文件中的引用
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 使用jdbc驱动数据源 -->
<bean id="dataSource"
class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 数据库基本信息配置 -->
<property name = "url" value = "${jdbc.url}" />
<property name = "username" value = "${jdbc.username}" />
<property name = "password" value = "${jdbc.password}" />
<property name = "driverClassName" value = "${jdbc.driverClassName}" />
<property name = "filters" value = "${jdbc.filters}" />
<!-- 最大并发连接数 -->
<property name = "maxActive" value = "${jdbc.maxActive}" />
<!-- 初始化连接数量 -->
<property name = "initialSize" value = "${jdbc.initialSize}" />
<!-- 配置获取连接等待超时的时间 -->
<property name = "maxWait" value = "${jdbc.maxWait}" />
<!-- 最小空闲连接数 -->
<property name = "minIdle" value = "${jdbc.minIdle}" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name = "timeBetweenEvictionRunsMillis" value ="${jdbc.timeBetweenEvictionRunsMillis}" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name = "minEvictableIdleTimeMillis" value ="${jdbc.minEvictableIdleTimeMillis}" />
<!-- 用来检测连接是否有效的sql,要求是一个查询语句 -->
<property name = "validationQuery" value = "${jdbc.validationQuery}" />
<!-- 申请连接的时候检测 -->
<property name = "testWhileIdle" value = "${jdbc.testWhileIdle}" />
<!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name = "testOnBorrow" value = "${jdbc.testOnBorrow}" />
<!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
<property name = "testOnReturn" value = "${jdbc.testOnReturn}" />
<!-- 超过时间限制是否回收 -->
<property name = "removeAbandoned" value = "${jdbc.removeAbandoned}" />
<!-- 超过时间限制多长 -->
<property name = "removeAbandonedTimeout" value ="${jdbc.removeAbandonedTimeout}" />
<!-- 关闭 abanded 连接时输出错误日志 -->
<property name = "logAbandoned" value = "${jdbc.logAbandoned}" />
</bean>
对于Druid,我上面的属性配置的比较全一些,如果根据注释还是看不懂,可以在下方留言评论,或者上网搜寻。
上面就是我使用过的两款数据库连接池。(为啥只是用了两种,只能说阿里的Druid做的太强大了)。
对于其他数据连接池的介绍和比较,推荐几个博文连接: