JDBC数据库连接池
用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。
数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
一.DBCP数据源
DBCP 是 Apache 软件基金组织下的开源连接池实现,要使用DBCP数据源,需要应用程序应在系统中增加如下两个 jar 文件:
- Commons-dbcp.jar:连接池的实现
- Commons-pool.jar:连接池实现的依赖库
Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
1.编写数据库连接池
编写dbcp连接池需实现java.sql.DataSource接口。
public void DBCPtest() throws SQLException{
BasicDataSource datasource=null;
//1.创建DBCP数据源实例
datasource=new BasicDataSource();
//2.为数据源指定必须的属性
datasource.setUsername("root");
datasource.setPassword("0404");
datasource.setUrl("jdbc:mysql://localhost:3303/extra");
datasource.setDriverClassName("com.mysql.jdbc.Driver");
//3.指定数据源的一些可选的属性
//1).指定数据库连接池中初始化连接数的个数
datasource.setInitialSize(10);
//2).指定数据库连接池中最大连接个数:同一时刻可以同时向数据库申请的连接个数
datasource.setMaxTotal(50);
//3).指定最小的连接数
datasource.setMinIdle(5);
//4).等待数据库连接池分配连接的最长时间,单位毫秒,超出抛异常
datasource.setMaxWaitMillis(1000*5);
//4.从数据源中获取数据库连接
Connection connection=datasource.getConnection();
System.out.println(connection);
}
指定的数据源的属性可以放在配置文件中:
username=root
password=0404
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3303/extra initialSize=10
maxTotal=50
minIdle=5
maxWaitMillis=5000
示例代码:
public void testDBCPWithDataSourceFactory() throws Exception{
Properties properties=new Properties();
InputStream inStream=JDBCTest.class.getClassLoader().
getResourceAsStream("dbcp.properties");
properties.load(inStream);
DataSource dataSource=BasicDataSourceFactory.createDataSource(properties);
System.out.println(dataSource.getConnection());
BasicDataSource basicDataSource=(BasicDataSource)dataSource;
System.out.println(basicDataSource.getMaxWaitMillis());
}
上面代码创建jdbc数据库连接池的步骤分为以下几步:
①加载dbcp的properties配置文件:配置文件中的键需要来自BasicDataSource的属性。
②调用BasicDataSourceFactory的createDataSource方法创建DataSource实例。
③从DataSource实例中获取数据库连接。
二.C3P0数据源
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate, Spring等。C3P0数据源在项目开发中使用得比较多。
要使用C3P0数据源,需要应用程序应在系统中增加如下两个 jar 文件:
- c3p0-0.9.2.jar
- mchange-commons.jar
- dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
1.创建c3p0数据库连接池
public void testC3P0() throws PropertyVetoException, SQLException{
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass( "com.mysql.jdbc.Driver" );
cpds.setJdbcUrl( "jdbc:mysql://localhost:3303/extra" );
cpds.setUser("root");
cpds.setPassword("0404");
System.out.println(cpds.getConnection());
}
同样可以将setxxx的属性放置在配置文件中:(c3p0的配置文件的格式为xml)
<c3p0-config>
<named-config name="helloC3P0">
<property name="user">root</property>
<property name="password">0404</property>
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3303/extra</property>
<!-- 若数据库中连接数不足时,一次性向数据库服务器申请多少个连接 -->
<property name="acquireIncrement">50</property>
<!-- 初始化数据库时连接池的个数 -->
<property name="initialPoolSize">100</property>
<!-- 数据库连接池中最小的数据库连接个数 -->
<property name="minPoolSize">50</property>
<property name="maxPoolSize">1000</property>
<!-- c3p0数据库连接池可以维护的Statement的最大的个数 -->
<property name="maxStatements">20</property>
<!-- 每个连接可以使用多少个Statement -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
示例代码:
public void testC3P0WithConfigFile() throws SQLException{
DataSource dataSource=new ComboPooledDataSource("helloC3P0");
System.out.println(dataSource.getConnection());
}
上面代码中:
①创建c3p0-config.xml文件,参考api帮助文档;
②创建ComboPooledDataSource实例:DataSource dataSource=new ComboPooledDataSource("helloC3P0");
③从DataSource实例中获取数据库连接。
至此JDBCTools中的数据库连接方法就可以改为:
private static DataSource dataSource=null;
static{
//数据库连接池应该只被初始化一次
dataSource=new ComboPooledDataSource("helloc3p0");
}
public static Connection getconnection2() throws SQLException{
return dataSource.getConnection();
}
JDBC数据库连接池的更多相关文章
- JAVA基础知识之JDBC——JDBC数据库连接池
JDBC数据库连接池 数据库的连接和关闭是很耗费资源的操作,前面介绍的DriverManager方式获取的数据库连接,一个Connection对象就对应了一个物理数据库连接,每次操作都要打开一个连接, ...
- JDBC 数据库连接池
http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html JDBC 数据库连接池 小结 当对数据库的访问不是很频繁时,可以在每次 ...
- 【Java123】JDBC数据库连接池建立
需求场景:多SQL任务多线程并行执行 解决方案:建立JDBC数据库连接池,将线程与连接一对一绑定 https://www.cnblogs.com/panxuejun/p/5920845.html ht ...
- Java自学-JDBC 数据库连接池
数据库连接池 与线程池类似的,数据库也有一个数据库连接池. 不过他们的实现思路是不一样的. 本章节讲解了自定义数据库连接池类:ConnectionPool,虽然不是很完善和健壮,但是足以帮助大家理解C ...
- JAVA之JDBC数据库连接池总结篇
JDBC数据库连接池 一.JDBC数据库连接池的必要性 二.数据库连接池技术 三.多种开源的数据库连接池 3.1 C3P0数据库连接池 3.2 DBCP数据库连接池 3.3 Druid(德鲁伊)数据库 ...
- JDBC数据库连接池技术
在JDBC中,获得连接或释放资源是非常消耗系统资源的两个过程,为了解决此类性能问题,通常采用连接池技术,来共享连接.这样我们就不需要每次都创建连接.释放连接了,这些操作都交给了连接池. 用池的概念来管 ...
- JDBC 数据库连接池 小结
原文:http://www.cnblogs.com/lihuiyy/archive/2012/02/14/2351768.html 当对数据库的访问不是很频繁时,可以在每次访问数据库时建立一个连接,用 ...
- JDBC数据库连接池原理
JDBC是java数据库连接的简称.它是一种用于实行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用java语言编写的类和接口组成.其相关的API都在java.sql.*包下 ...
- Java jdbc数据库连接池总结!(转)
1. 引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的 ...
随机推荐
- 洛谷P1393 动态逆序对(CDQ分治)
传送门 题解 听别人说这是洛谷用户的双倍经验啊……然而根本没有感觉到……因为另外的那题我是用树状数组套主席树做的……而且莫名其妙感觉那种方法思路更清晰(虽然码量稍稍大了那么一点点)……感谢Candy大 ...
- BZOJ3786: 星系探索(伪ETT)
题面 传送门 题解 坑啊--我好像把\(Splay\)的东西全忘光了-- \(ETT\)(\(Euler\ Tour\ Tree\))是一种可以资瓷比\(LCT\)更多功能的数据结构,然而不管是功能还 ...
- django参考博客学习
网上发现其他人的一个django系列博客,和我学的一样是黑马的,写的挺不错的,转载学习一下 https://blog.csdn.net/u014745194/article/category/6989 ...
- forward与redirect
前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址:后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接.这样,从浏览器的地址栏中可以看到跳转后的链接地址.所以,前者 ...
- css效果小计
在工作学习中总能发现一些新鲜的页面效果可以用不同的css完成,在这里将遇到的一些css做下记录,以便日后翻阅,如果其中的写法不对,或者有更优写法欢迎留言,不胜感激 1.关于用一个div做出双边框(由于 ...
- 数据结构:广义表的实现(Java)
广义表的简单理解在这篇博文中:https://blog.csdn.net/lishanleilixin/article/details/87364496,在此不做赘述. Java实现广义表: pack ...
- keycloak ssl-required报错问题处理
两台主机,网段不同,第一台129.30.108.179/24 第二台172.16.160.92/24 都安装keycloak : docker run -d --name keycl ...
- 等价类计数问题(Polya定理和burnside引理)
零.约定: (置换等名词会在前置知识中有解释) \(1.\)在本文中,题目要求的染色方案等统称为"元素". \(2.\)两个元素严格相等我们记做"\(=\)", ...
- linux ln 命令,相当于windows快捷方式
ln -s 源文件 目标文件. ln -s ** **,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间, 硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大 ...
- Mac 10.12原生方法对NTFS分区进行读写的配置
说明:不一定有效,最简单的方法就是不用NTFS,直接FAT32,对于大文件就用切割. 方法: 1.确定U盘名称 diskutil list ls /Volumes/ 2.比如我找到的U盘名称为Unti ...