技术干货 | 金仓数据库使用“小妙招”——常用三大连接池中间件帮你提高效率
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。这样的好处是节省了应用频繁建立关闭数据库连接的开销,同时也统一了数据库连接的资源,便于管理。当然还有很多其它高级功能比如动态资源控制,连接检测等。连接池运用得好,将大大提高应用的开发和运行效率。
目前金仓数据库常用的数据库连接池有DBCP、C3P0和Druid三种,下面将对这三种连接池与Spring和SpringBoot整合使用的配置进行简单说明。
金仓配置DBCP说明
DBCP数据库连接池是apache上的一个Java连接池项目。DBCP通过连接池预先同数据库建立一些连接放在内存中(即连接池中),应用程序需要建立数据库连接时直接从连接池中申请一个连接使用,用完后由连接池回收该连接,从而达到连接复用、减少资源消耗的目的。下面将根据实际案例介绍金仓数据库搭配DBCP的使用说明。
使用Spring
整合DBCP配置金仓数据源
Spring可以通过application.xml配置bean的方式来设置数据源,下面是配置金仓数据源的配置例子。关键是配置金仓驱动类名字和连接串,其它参数请参照例子中的注释,更多请参考官网介绍。
<bean id="dataSource_dbcp"
class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!—金仓JDBC驱动类名字 -->
<property name="driverClassName" value="com.kingbase8.Driver" />
<!—金仓JDBC连接串 -->
<property name="url" value="jdbc:kingbase8://127.0.0.1:54321/TEST" />
<property name="username" value="SYSTEM" />
<property name="password" value="123456" />
<property name="initialSize" value="10" />
<property name="maxActive" value="50" />
<property name="minIdle" value="5" />
<!-- 空闲连接回收线程运行的时间间隔,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!--连接有效性检测-->
<property name="validationQuery" value="SELECT 1" />
</bean>
使用Springboot
整合DBCP配置金仓数据源
这里使用maven导入依赖包,通过Springboot的配置文件配置数据源。
第一步导入金仓JDBC驱动和DBCP依赖包
<!—dbcp中间件 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
</dependency>
<!—金仓JDBC驱动包 -->
<dependency>
<groupId>com.kingbase8</groupId>
<artifactId>kingbase8</artifactId>
<version>8.2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/kingbase8-8.2.0.jar</systemPath>
</dependency>
第二步通过配置文件来配置DBCP和金仓数据源
Springboot有两种配置方式,第一种是application.yml配置文件,第二种是application.properties配置文件。下面分别介绍两种配置方式配置金仓的方式。
第一种:通过application.yml文件配置DBCP和金仓数据源
spring:
# DBCP的金仓数据源配置
datasource:
type: org.apache.commons.dbcp2.BasicDataSource
driver-class-name: com.kingbase8.Driver
url: jdbc:kingbase8://127.0.0.1:54321/TEST
username: SYSTEM
password: 123456
# DBCP的其它参数配置
dbcp2:
# 初始化大小,最小,最大
initial-size: 10
min-idle: 5
max-total: 50
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存时间
min-evictable-idle-time-millis: 1800000
validation-query: SELECT 1
第二种:通过application.properties文件配置DBCP和金仓数据源
#金仓数据源配置
spring.datasource.url= jdbc:kingbase8://127.0.0.1:54321/TEST
spring.datasource.driver-class-name= com.kingbase8.Driver
spring.datasource.username= SYSTEM
spring.datasource.password=123456
#DBCP连接池其它参数配置
spring.datasource.type=org.apache.commons.dbcp2.BasicDataSource
spring.datasource.dbcp2.min-idle=5
spring.datasource.dbcp2.initial-size=10
spring.datasource.dbcp2.max-total=50
spring.datasource.dbcp2.timeBetweenEvictionRunsMillis=60000
spring.datasource.dbcp2.minEvictableIdleTimeMillis=1800000
spring.datasource.dbcp2.validation-query=SELECT 1
金仓配置C3P0说明
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。下面将根据实际案例介绍金仓数据库搭配C3P0的使用说明。
使用Spring
整合C3P0配置金仓数据源
Spring可以通过application.xml配置bean的方式来设置数据源,下面是配置金仓数据源的配置例子。关键是配置金仓驱动类名字和连接串,其它参数请参照例子中的注释,更多请参考官网介绍。
<bean id="dataSource_c3p0"
class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<!--金仓JDBC驱动类名字 -->
<property name="driverClass" value="com.kingbase8.Driver" />
<!—金仓JDBC连接串 -->
<property name="jdbcUrl" value="jdbc:kingbase8://127.0.0.1:54321/TEST" />
<property name="user" value="SYSTEM" />
<property name="password" value="123456" />
<property name="maxPoolSize" value="50" />
<property name="minPoolSize" value="5" />
<property name="initialPoolSize" value="10" />
<!--最大空闲时间,单位秒 -->
<property name=“maxIdleTime" value="1800" />
<!--连接有效性检测-->
<property name="preferredTestQuery">select 1</property>
<!-- 每隔几秒检查连接池中空闲连接的有效性 -->
<property name="idleConnectionTestPeriod">60</property>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement">3</property>
</bean>
使用Springboot
整合C3P0配置金仓数据源
这里使用maven导入依赖包,通过Springboot的配置文件配置数据源。
第一步导入金仓JDBC驱动和C3P0依赖包
<!—C3P0中间件 -->
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.4</version>
</dependency>
<!—金仓JDBC驱动 -->
<dependency>
<groupId>com.kingbase8</groupId>
<artifactId>kingbase8</artifactId>
<version>8.2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/kingbase8-8.2.0.jar</systemPath>
</dependency>
第二步通过配置文件来配置C3P0和金仓数据源
Springboot有两种配置方式,第一种是application.yml配置文件,第二种是application.properties配置文件。下面分别介绍两种配置方式配置金仓的方式。
第一种:通过application.yml文件配置C3P0和金仓数据源
spring:
# C3P0的金仓数据源配置
datasource:
type: com.mchange.v2.c3p0.ComboPooledDataSource
driverClass: com.kingbase8.Driver
jdbcUrl: jdbc:kingbase8://127.0.0.1:54321/TEST
user: SYSTEM
password: 123456
# C3P0的其它参数配置
# 初始化大小,最小,最大
initialPoolSize: 10
minPoolSize: 5
maxPoolSize: 50
maxIdleTime: 1800
preferredTestQuery: SELECT 1
idleConnectionTestPeriod: 60
acquireIncrement: 3
第二种:通过application.properties文件配置C3P0和金仓数据源
#金仓数据源配置
spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
spring.datasource.driverClass= com.kingbase8.Driver
spring.datasource.jdbcUrl= jdbc:kingbase8://127.0.0.1:54321/TEST
spring.datasource.user= SYSTEM
spring.datasource.password=123456
# C3P0连接池其它参数配置
# 初始化大小,最小,最大
spring.datasource.initialPoolSize=10
spring.datasource.minPoolSize=5
spring.datasource.maxPoolSize=50
spring.datasource.maxIdleTime=1800
spring.datasource.preferredTestQuery=SELECT 1
spring.datasource.idleConnectionTestPeriod=60
spring.datasource.acquireIncrement=3
编写C3P0连接池配置类
C3P0连接池不支持自动配置,编写C3P0连接池配置类,创建ComboPooledDataSource Bean,并将配置文件中指定前缀的属性绑定进bean实例中:
@Configuration
public class DatasourceConfig {
@Bean //标注@Bean后表明返回对象为
@Primary //primary将当前数据库连接池作为默认数据库连接池
@ConfigurationProperties(prefix = "spring.datasource") //将配置文件中指定前缀的属性绑定进bean实例中
public DataSource dataSource(){
return new ComboPooledDataSource();
}
}
金仓配置Druid说明
Druid为阿里巴巴的数据源(数据库连接池)开源项目,集合了C3P0、DBCP、proxool等连接池的优点,还加入了日志监控,有效地监控DB池连接和SQL的执行情况。下面将通过实际案例介绍金仓数据库搭配Druid的使用说明。
使用Spring
整合Druid配置金仓数据源
Spring可以通过application.xml配置bean的方式来设置数据源,下面是配置金仓数据源的配置例子。关键是配置金仓驱动类名字和连接串,其它参数请参照例子中的注释,更多请参考官网介绍。
<bean id="dataSource_druid" class="com.alibaba.druid.pool.DruidDataSource"
init-method="init" destroy-method="close">
<!—金仓JDBC驱动类名字 -->
<property name="driverClassName" value="com.kingbase8.Driver" />
<!—金仓JDBC连接串 -->
<property name="url" value="jdbc:kingbase8://127.0.0.1:54321/TEST" />
<property name="username" value="SYSTEM" />
<property name="password" value="123456" />
<property name="initialSize" value="10" />
<property name="maxActive" value="50" />
<property name="minIdle" value="5" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<property name="validationQuery" value="SELECT 1" />
<property name="testWhileIdle" value="true" />
<!-- 配置监控统计拦截的filters, filters常用种类:
监控统计用的filter:stat
日志用的filter:log4j
防御sql注入的filter:wall目前不支持国产数据库-->
<property name="filters" value="stat,log4j" />
</bean>
注意:
1.Druid需要配置driverClassName才能支持国产数据库;
2.防御sql注入的filter:wall目前不支持国产数据库。
使用Springboot
整合Druid配置金仓数据源
这里使用maven导入依赖包,通过Springboot的配置文件配置数据源。
第一步导入金仓JDBC驱动和Druid依赖包
<!—Druid中间件 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.16</version>
<scope>compile</scope>
</dependency>
<!—金仓JDBC驱动 -->
<dependency>
<groupId>com.kingbase8</groupId>
<artifactId>kingbase8</artifactId>
<version>8.2.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/kingbase8-8.2.0.jar</systemPath>
</dependency>
第二步通过配置文件来配置Druid和金仓数据源
Springboot有两种配置方式,第一种是application.yml配置文件,第二种是application.properties配置文件。下面分别介绍两种配置方式配置金仓的方式。
第一种:通过application.yml文件配置Druid和金仓数据源
spring:
# Druid的金仓数据源配置
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.kingbase8.Driver
url: jdbc:kingbase8://127.0.0.1:54321/TEST
username: SYSTEM
password: 123456
# Druid的其它参数配置
druid:
# 初始化大小,最小,最大
initial-size: 10
min-idle: 5
max-active: 50
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存时间
min-evictable-idle-time-millis: 1800000
validation-query: SELECT 1
test-while-idle: true
filters: stat,log4j
第二种:通过application.properties文件配置Druid和金仓数据源
#金仓数据源配置
spring.datasource.type = com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name = com.kingbase8.Driver
spring.datasource.druid.url = jdbc:kingbase8://127.0.0.1:54321/TEST
spring.datasource.druid.username= SYSTEM
spring.datasource.druid.password=123456
# Druid连接池其它参数配置
# 初始化大小,最小,最大
spring.datasource.druid.initialSize=10
spring.datasource.druid.minIdle=5
spring.datasource.druid.maxActive=50
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
spring.datasource.druid.timeBetweenEvictionRunsMillis=60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
spring.datasource.druid.minEvictableIdleTimeMillis=1800000
spring.datasource.druid.validationQuery=SELECT 1
spring.datasource.druid.testWhileIdle=true
spring.datasource.druid.filters=stat,log4j
常见问题分析
应用登录、访问速度有时变慢
比如一个应用使用C3P0连接池,其中有项配置是maxidletime= 10, 就是10秒内没用的连接就会被C3P0关闭。但是恰巧这个业务都是间歇性短业务,使用数据库连接的时间都很短。造成的现象就是C3P0总是在频繁的建立关闭,这消耗了大量时间,造成业务反应变慢,后面调整该参数到1800秒,业务恢复正常。所以最好是根据各自的业务实际情况来控制连接池的各项参数以做到最优效果。
应用在启动后一段时间后再使用发现连接已关闭
有些应用在申请连接后长时间不使用但是也不归还连接池,这样的空闲连接很可能被防火墙或者网络节点关掉。此时可开启服务器的心跳检测机制,保持连接的活性。开启配置需在服务器kingbase.conf配置文件中配置以下参数:
tcp_keepalives_idle = 5
tcp_keepalives_interval =5
tcp_keepalives_count = 10
简单修改配置,
让你的应用无缝迁移
到KingbaseES V8数据库
如果当前应用已经采用了连接池中间件,那么基本上只需要修改两项配置:jdbc的驱动类名字和URL连接串,即可快速切换到金仓数据源上。通过连接池的池化操作,降低频繁创建新连接所带来的时间开销,从而改善应用的访问速度,提升用户体验。
假如每个业务工作线程都自己创建连接,再访问数据库处理自身业务,最后关闭连接。那么每个业务操作都会等待几百毫秒让连接完成,才能开始实际的业务处理。因为创建新连接时,底层需要网络IO操作,报文加密,用户密码认证,数据库权限处理等等,这本身就会消耗多达几百毫秒甚至更多的时间开销。但是当使用连接池机制时,这部分工作只是在连接池初始化时产生,后续业务实际的创建连接操作就变成了从连接池中获取一个空闲连接的操作,时间消耗降低到几十毫秒。尤其是当业务中有频繁的获取连接操作时,连接池就会带来非常可观的时间收益。
参考内容
更多内容请参考官方手册
DBCP
http://commons.apache.org/proper/commons-dbcp/
C3P0
https://www.mchange.com/projects/c3p0/
Druid
https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98
点“在看”给我一朵小花