浅谈常用Java数据库连接池(小结)

 更新时间:2019年07月09日 10:34:21   作者:2Simple  
这篇文章主要介绍了浅谈常用Java数据库连接池(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

概述

在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接。通常,与数据库服务进行通信的网络协议无需由应用程序本身实现,原因有三:

1.实现复杂度大,需要充分理解和掌握相应的通信协议。
2.代码难以复用,每个应用程序都需要独立实现一套对应的网络协议(不同公司之间,同一公司的不同技术栈之间难以复用实现相同协议的代码)
3.性能难以保证,不同的网络协议实现可能存在巨大的性能差距

正因为如此,所以现实的实现方式是:

首先,定义网络协议标准,这样只要支持这个标准协议的数据库就可以使用相应的客户端与之通信。

其次,将实现这个标准协议的客户端独立为一个通信库,这样只需要在应用程序中使用这个通信组件库就可以方便地实现与数据库进行交互。

通常,我们将实现了网络协议的通信库称之为数据库驱动程序。当然,对于不同的编程语言,需要对应编写相应的数据库驱动

实现。以与关系型数据库通信为例,在Java中实现的驱动程序为JDBC,Python中的驱动程序为MySQLdb。
由于通过TCP与数据库建立网络连接的代价非常高昂,而且耗时(TCP建立连接需要“三次握手”,断开连接需要“四次握手”)。所以在实践中通常不直接单独使用连接进行数据库操作,而是使用连接池的方式,这主要是处于以下两方面的考虑:

应用程序本身需要更低的响应时间,如果每次数据库操作都需要经过“建立连接->通信(增删改查)->断开连接”这个过程,那么势必会导致响应延时的增加。

避免服务器资源被耗尽,随着业务量的增大,对应的数据库操作必然会随之增加,如果对客户端的连接数不加以控制,可能会导致数据库服务器的CPU和内存资源被大量的网络连接快速耗尽,这样将导致服务不可用。

在Java中使用得比较流行的数据库连接池主要有:DBCP,c3p0,druid。

另外,不论使用什么连接池,低层都是使用JDBC连接,即:在应用程序中都需要加载JDBC驱动程序。

DBCP

https://commons.apache.org/proper/commons-dbcp/index.html

DBCP是Apache下独立的数据库连接池组件,在Tomcat中使用的连接池组件就是DBCP,支持JDBC3,JDBC4。关于更多JDBC版本信息,详见:https://en.wikipedia.org/wiki/Java_Database_Connectivity

c3p0

http://www.mchange.com/projects/c3p0/
使用c3p0有多种方式,如:既可以直接使用API方式配置c3p0,也可以通过文件的方式进行配置,配置文件有2种形式:properties或xml文件。

<dependencies>
  <!-- JDBC驱动 -->
  <dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.42</version>
  </dependency>
  
  <!-- c3p0连接池 -->
  <dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
  </dependency>

  <!-- 日志组件 -->
  <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.25</version>
  </dependency>
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.2.3</version>
  </dependency>
  <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
  </dependency>
</dependencies>

1.使用Java API方式配置c3p0

ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" ); //loads the jdbc driver      
cpds.setJdbcUrl("jdbc:mysql://host:port/db");
cpds.setUser("username");                 
cpds.setPassword("password");                 
  
cpds.setMinPoolSize(5);                   
cpds.setMaxPoolSize(20);
cpds.setAcquireIncrement(5);

// 直接从连接池中获取连接
Connection conn = cpds.getConnection();
query(conn);

// 关闭连接池
// cpds.close();

2.使用文件方式配置c3p0

2.1 使用c3p0.properties文件进行配置

需要在classpath路径下添加配置文件:c3p0.properties,内容如下:

c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://host:port/db
c3p0.user=root
c3p0.password=
c3p0.minPoolSize=5
c3p0.maxPoolSize=20
c3p0.acquireIncrement=5

在应用程序中只需要直接创建ComboPooledDataSource对象即可(c3p0会自动从classpath加载c3p0.properties中的配置信息):

ComboPooledDataSource cpds = new ComboPooledDataSource();
Connection conn = cpds.getConnection();
query(conn);
cpds.close();

注意: 使用c3p0.properties作为配置文件时,每个参数的name前缀必须是“c3p0”,如:“c3p0.driverClass=com.mysql.jdbc.Driver”。

2.2 使用c3p0-config.xml文件进行配置

使用这种方式会比使用c3p0.properties更加高级,支持配置多个数据源,同样需要在classpath路径下添加文件:c3p0-config.xml。

<c3p0-config>
  <!-- 默认数据源 -->
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://host:port/db</property>
    <property name="user">username</property>
    <property name="password">password</property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>
    <property name="acquireIncrement">5</property>
  </default-config>

  <!-- 定义带名称的数据源 -->
  <named-config name="myDataSource">
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/test_jdbc</property>
    <property name="user">root</property>
    <property name="password"></property>
    <property name="minPoolSize">5</property>
    <property name="maxPoolSize">20</property>
    <property name="acquireIncrement">5</property>
  </named-config>
</c3p0-config>
// 使用默认数据源
// ComboPooledDataSource cpds = new ComboPooledDataSource();

// 使用指定名称的数据源
ComboPooledDataSource cpds = new ComboPooledDataSource("myDataSource");
Connection conn = cpds.getConnection();
query(conn);
cpds.close();

3.c3p0常用配置

<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://host:port/db</property>
    <property name="user">username</property>
    <property name="password">password</property>

    <!-- 连接池初始化时创建的连接数,默认值: 3 -->
    <property name="initialPoolSize">3</property>
    <!-- 连接池保持的最小连接数,默认值: 3 -->
    <property name="minPoolSize">3</property>
    <!-- 连接池中拥有的最大连接数,如果获得新连接时会使连接总数超过这个值则不会再获取新连接,而是等待其他连接释放。 -->
    <property name="maxPoolSize">15</property>
    <!-- 连接池在无空闲连接可用时一次性创建的新数据库连接数,默认值: 3 -->
    <property name="acquireIncrement">3</property>
    <!-- 连接的最大空闲时间,如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接。为0,则永远不会断开连接。默认值: 0,单位: 秒 -->
    <property name="maxIdleTime">0</property>
    <!-- 连接测试语句 -->
    <property name="preferredTestQuery">select 1</property>
    <!-- 用来配置测试空闲连接的间隔时间。可以用来解决MySQL 8小时断开连接的问题。因为它保证连接池会每隔一定时间对空闲连接进行一次测试,从而保证有效的空闲连接能每隔一定时间访问一次数据库,将MySQL8小时无会话的状态打破。为0则不测试。默认值:0,单位: 秒 -->
    <property name="idleConnectionTestPeriod">30</property>
    <!-- 连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。默认值: 30 -->
    <property name="acquireRetryAttempts">30</property>
    <!-- 连接池在获得新连接时的间隔时间,默认值: 1000,单位: 毫秒 -->
    <property name="acquireRetryDelay">1000</property>
  </default-config>
</c3p0-config>

druid

https://github.com/alibaba/druid
阿里开源的druid不单纯是一个连接池,还添加了监控功能,目前已经是非常受推崇的连接池组件,详细配置参数请参考官网。

当然,还存在一些其他的数据库连接池实现,例如:Tomcat自己就实现了一个连接池组件,根据官方的说法,这个连接池正是为了在Tomcat中替换DBCP,详见:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 阿里dubbo出错提示Thread pool is EXHAUSTED问题及解决方法

    阿里dubbo出错提示Thread pool is EXHAUSTED问题及解决方法

    这篇文章主要介绍了阿里dubbo出错提示Thread pool is EXHAUSTED的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java中的BlockingQueue接口源码解析

    Java中的BlockingQueue接口源码解析

    这篇文章主要介绍了Java中的BlockingQueue接口源码解析,BlockingQueue接口表示阻塞队列,是Java并发包中阻塞队列的接口定义规范,阻塞队列意味着对于该队列的操作是线程安全的,当多个线程存放元素进入队列或者从队列中取出元素都是线程安全的,需要的朋友可以参考下
    2023-11-11
  • java开发中如何使用JVisualVM进行性能分析

    java开发中如何使用JVisualVM进行性能分析

    JVisualVM是由Sun提供的性能分析工具,如此强大的后盾怎能不强大?在Jdk6.0以后的版本中是自带的,配置好环境变量然后在运行中输入“JVisualVm”或直接到Jdk的安装目录的Bin目录下找到运行程序即可运行。如果是用Jdk1.5或以前版本的朋友就得要单独安装了
    2015-12-12
  • JPA配置方式+逆向工程映射到Entity实体类

    JPA配置方式+逆向工程映射到Entity实体类

    这篇文章主要介绍了JPA配置方式+逆向工程映射到Entity实体类,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Spring Boot利用@Async异步调用:使用Future及定义超时详解

    Spring Boot利用@Async异步调用:使用Future及定义超时详解

    这篇文章主要给大家介绍了关于Spring Boot利用@Async异步调用:使用Future及定义超时的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用spring boot具有一定的参考学习价值,需要的朋友可以参考下
    2018-05-05
  • Spring Boot集成starrocks快速入门Demo(适用场景)

    Spring Boot集成starrocks快速入门Demo(适用场景)

    StarRocks 是新一代极速全场景 MPP (Massively Parallel Processing) 数据库,StarRocks 的愿景是能够让用户的数据分析变得更加简单和敏捷,这篇文章主要介绍了Spring Boot集成starrocks快速入门Demo,需要的朋友可以参考下
    2024-08-08
  • Java连接ftp服务器实例代码

    Java连接ftp服务器实例代码

    这篇文章主要介绍了Java连接ftp服务器实例代码 的相关资料,需要的朋友可以参考下
    2015-12-12
  • Java找不到或无法加载主类及编码错误问题的解决方案

    Java找不到或无法加载主类及编码错误问题的解决方案

    今天小编就为大家分享一篇关于Java找不到或无法加载主类及编码错误问题的解决方案,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • myeclipse智能提示设置的实现方法

    myeclipse智能提示设置的实现方法

    本篇文章介绍了,myeclipse智能提示设置的实现方法。需要的朋友参考下
    2013-05-05
  • Java女装商城系统的实现流程

    Java女装商城系统的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+SSM+jsp+mysql+maven实现一个女装商城系统,大家可以在过程中查缺补漏,提升水平
    2021-11-11

最新评论