浅谈常用Java数据库连接池(小结)
概述
目前创新互联已为1000多家的企业提供了网站建设、域名、网站空间、网站运营、企业网站设计、阆中网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的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文件。
mysql mysql-connector-java 5.1.42 com.mchange c3p0 0.9.5.2 org.slf4j slf4j-api 1.7.25 ch.qos.logback logback-core 1.2.3 ch.qos.logback logback-classic 1.2.3
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。
com.mysql.jdbc.Driver jdbc:mysql://host:port/db username password 5 20 5 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test_jdbc root 5 20 5
// 使用默认数据源 // ComboPooledDataSource cpds = new ComboPooledDataSource(); // 使用指定名称的数据源 ComboPooledDataSource cpds = new ComboPooledDataSource("myDataSource"); Connection conn = cpds.getConnection(); query(conn); cpds.close();
3.c3p0常用配置
com.mysql.jdbc.Driver jdbc:mysql://host:port/db username password 3 3 15 3 0 select 1 30 30 1000
druid
https://github.com/alibaba/druid
阿里开源的druid不单纯是一个连接池,还添加了监控功能,目前已经是非常受推崇的连接池组件,详细配置参数请参考官网。
当然,还存在一些其他的数据库连接池实现,例如:Tomcat自己就实现了一个连接池组件,根据官方的说法,这个连接池正是为了在Tomcat中替换DBCP,详见:https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。
本文名称:浅谈常用Java数据库连接池(小结)
网页网址:http://ybzwz.com/article/isjhps.html