HikariCP是当下比较火的数据库连接池,号称性能最好,可以PK当前任意数据库连接池。那么数据库连接池到底是什么?它的作用又是什么呢?
要说数据库连接池,就得从用户请求链接开始,如下图所示,用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。并且很容易造成数据库服务器内存溢出、宕机。
为了解决上述问题,使用数据库连接池技术来优化程序性能。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。由于连接池中存储了建立数据库连接的信息,因此也有数据源的称呼。使用数据库连接池后的请求过程如下图所示,数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。后文将会详细讨论这两个参数如何更好的设置。
通过上面的连接池技术,可以大大的优化程序性能。而不同的连接池的并发压力下的稳定性等各有不同。前几年比较热门的有boneCP、dbcp、c3p0等。其中boneCP前几年一直火热,不过现在开始慢慢步入夕阳。就连boneCP项目的作者也要弃他而去,并推荐了未来的主角HikariCP。HikariCP以其“快速、简单、可靠”的特点,受到程序员越来越多的青睐。下面我们来看看它是如何用的。
在spring框架中,经常将连接池的设置参数独立成一个.properties文件,它可以根据客户需求,自定义一些相关的参数。而参数的读取一般写到applicationContext.xml的文件中(后文将会详细介绍该文件的作用)。然后通过org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类将.properties(key/value形式)文件中设定的值在xml中替换为占位该键($key)的值,这样的设计可以灵活些。
pom
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.4.7</version>
</dependency>
spring-datasource.xml
<bean id = "dataSource" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maximumPoolSize" value="100" />
<property name="minimumIdle" value="10" />
<property name="connectionTestQuery" value="select 1" />
<property name="dataSourceProperties">
<props>
<prop key="cachePrepStmts">true</prop>
<prop key="prepStmtCacheSize">250</prop>
<prop key="prepStmtCacheSqlLimit">2048</prop>
<prop key="useServerPrepStmts">true</prop>
</props>
</property>
</bean>