【JDBC核心】数据库连接池
数据库连接池
传统模式
使用数据库的传统模式:
- 在主程序(servlet、beans等)中建立数据库连接;
- 进行 SQL 操作;
- 断开数据库连接。
这种模式存在的问题:
- JDBC 连接数据库的方式(四个步骤:加载配置、读取配置、加载驱动、获取连接),会消耗大量的资源和时间,且连接资源没有得到很好的重复利用;
- 获取一次数据库连接,使用完成后都得关闭连接;
- 不能控制被创建的连接对象数。
数据库连接池技术
基本思想:为数据库连接建立一个“缓冲池”,预先在缓冲池中放入一定数量的连接,当需要建立数据库连接是,只需要从“缓冲池”中取出一个,使用完毕之后再放回去。
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复利用一个现有的数据库连接,而不是重新建立一个。
数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
数据库连接池的优点:
- 资源重用;
- 更快的响应速度和更少的资源消耗;
- 统一的连接管理,避免数据库连接泄露。
开源的数据库连接池
JDBC 的数据库连接池使用 javax.sql.DataSource
来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现。
DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分。
DataSource 用来取代 DriverManager 来获取 Connection,获取速度快,同时可以大幅度提高数据库访问速度。
注意:
- 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
- 当数据库访问结束后,程序还是像以前一样关闭数据库连接:
connnection.close()
,但它并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。
开源的数据库连接池:
- DBCP 是Apache提供的数据库连接池。tomcat 服务器自带 dbcp 数据库连接池。速度相对 c3p0 较快,但因自身存在 BUG,Hibernate3 已不再提供支持。
- C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以 。hibernate 官方推荐使用。
- Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较 c3p0 差一点。
- BoneCP 是一个开源组织提供的数据库连接池,速度快。
- Druid 是阿里提供的数据库连接池,据说是 集DBCP 、C3P0 、Proxool 优点于一身的数据库连接池。
package cn.parzulpan.jdbc.ch08;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.DataSources;
import org.junit.Test;
import java.sql.Connection;
/**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : c3p0 数据库连接池
*/
public class C3P0Test {
// 连接方式一:不推荐
@Test
public void testGetConnection1() throws Exception{
// 获取 c3p0 数据库连接池
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver");
cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false");
cpds.setUser("parzulpan");
cpds.setPassword("parzulpan");
//
cpds.setInitialPoolSize(10);
Connection connection = cpds.getConnection();
System.out.println(connection);
}
// 连接方式二:使用配置文件,推荐
// 使用时,需要将 cpds 声明为 static,然后用 static 代码块为 cpds 赋值
@Test
public void testGetConnection2() throws Exception{
ComboPooledDataSource cpds = new ComboPooledDataSource("helloc3p0");
Connection connection = cpds.getConnection();
System.out.println(connection);
// 销毁 c3p0 数据库连接池,慎用
// DataSources.destroy(cpds);
}
}
<!-- c3p0配置文件-->
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
<named-config name="helloc3p0">
<!-- 获取连接的基本信息-->
<property name="driverClass">com.mysql.jdbc.Driver</property>
<property name="jdbcUrl">jdbc:mysql://localhost:3306/test?useSSL=false</property>
<property name="user">parzulpan</property>
<property name="password">parzulpan</property>
<!-- 数据库连接池的管理的相关属性的设置-->
<!-- 若数据库连接池中连接数不足时,一次向数据库服务器申请的连接数-->
<property name="acquireIncrement">5</property>
<!-- 初始化数据库连接池时连接的数量-->
<property name="initialPoolSize">5</property>
<!-- 数据库连接池中的最小的数据库连接数-->
<property name="minPoolSize">5</property>
<!-- 数据库连接池中的最大的数据库连接数-->
<property name="maxPoolSize">10</property>
<!-- 数据库连接池可以维护的 Statement 的个数 -->
<property name="maxStatements">20</property>
<!-- 每个连接同时可以使用的 Statement 对象的个数 -->
<property name="maxStatementsPerConnection">5</property>
</named-config>
</c3p0-config>
package cn.parzulpan.jdbc.ch08;
import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : dbcp 数据库连接池
*/
public class DBCPTest {
// 连接方式一:不推荐
@Test
public void testGetConnection1() throws Exception{
BasicDataSource bds = new BasicDataSource();
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost:3306/test?useSSL=false");
bds.setUsername("parzulpan");
bds.setPassword("parzulpan");
bds.setInitialSize(10);
Connection connection = bds.getConnection();
System.out.println(connection);
}
// 连接方式二:使用配置文件,推荐
// 使用时,需要将 dataSource 声明为 static,然后用 static 代码块为 dataSource 赋值
@Test
public void testGetConnection2() throws Exception{
Properties properties = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties");
properties.load(is);
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
# dbcp 配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false
username=parzulpan
password=parzulpan
initialSize=10
package cn.parzulpan.jdbc.ch08;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.util.Properties;
/**
* @Author : parzulpan
* @Time : 2020-12-01
* @Desc : Druid 数据库连接池
*/
public class DruidTest {
// 连接方式一:使用配置文件,推荐
// 使用时,需要将 dataSource 声明为 static,然后用 static 代码块为 dataSource 赋值
@Test
public void testGetConnection1() throws Exception{
Properties properties = new Properties();
InputStream is = ClassLoader.getSystemClassLoader().getResourceAsStream("druid.properties");
properties.load(is);
DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
Connection connection = dataSource.getConnection();
System.out.println(connection);
}
}
# Druid 配置文件
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test?useSSL=false
username=parzulpan
password=parzulpan
initialSize=10
maxActive=20
maxWait=1000
filters=wall
练习和总结
【JDBC核心】数据库连接池的更多相关文章
- 数据库连接JDBC和数据库连接池C3P0自定义的java封装类
数据库连接JDBC和数据库连接池C3P0自定义的java封装类 使用以下的包装类都需要自己有JDBC的驱动jar包: 如 mysql-connector-java-5.1.26-bin.jar(5.1 ...
- Java -- JDBC 学习--数据库连接池
JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet.beans)中建立数据库连接. 进行sql操作 断开数据库连接. 这种模式开 ...
- JDBC【数据库连接池、DbUtils框架、分页】
1.数据库连接池 什么是数据库连接池 简单来说:数据库连接池就是提供连接的... 为什么我们要使用数据库连接池 数据库的连接的建立和关闭是非常消耗资源的 频繁地打开.关闭连接造成系统性能低下 编写连接 ...
- Java Web(九) JDBC及数据库连接池及DBCP,c3p0,dbutils的使用
DBCP.C3P0.DBUtils的jar包和配置文件(百度云盘):点我下载 JDBC JDBC(Java 数据库连接,Java Database Connectify)是标准的Java访问数据库的A ...
- 基于JDBC的数据库连接池技术研究与应用
引言 近年来,随着Internet/Intranet建网技术的飞速发展和在世界范围内的迅速普及,计算机 应用程序已从传统的桌面应用转到Web应用.基于B/S(Browser/Server)架构的3层开 ...
- spring配置tomcat jdbc pool数据库连接池
<bean id="sqliteDataSource" class="org.apache.tomcat.jdbc.pool.DataSource" de ...
- JavaEE JDBC 了解数据库连接池
了解数据库连接池 @author ixenos 数据库连接是有限的资源,如果用户需要离开应用一段时间,那么他占用的连接就不应该保持开放状态: 另一方面,每次查询都获取连接并在随后关闭它的代价也很高. ...
- JDBC和数据库连接池
JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成. ● JDBC ● C3P0 ● DRUID 一.JDBC ...
- 关于jdbc和数据库连接池的关系(不是封装的关系)
你都说是数据库连接池了.那就是连接数据库用的.JDBC是java封装的对数据库的操作.当然你可以自己进一步封装.数据库连接池是JDBC使用的前提,如果连数据库连接池都没连上,JDBC的操作就谈不上了. ...
- Jdbc druid数据库连接池
//测试类package druid; import util.JdbcUtilsDruid; import java.sql.Connection; import java.sql.Date; im ...
随机推荐
- .pfx和.Cer 证书
通常情况下,作为文件形式存在的证书一般有三种格式: 第一种:带有私钥的证书,由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进 ...
- 深入理解Java虚拟机(四)——HotSpot垃圾收集器详解
垃圾收集器 新生代收集器 1.Serial收集器 特点: 单线程工作,收集的时候就会停止其他所有工作线程,用户不可知不可控,会使得用户界面出现停顿. 简单高效,是所有收集器中额外内存消耗最少的. 没有 ...
- mybatis逆向工程运行
命令: mvn mybatis-generator:generate 项目结构: generatorConfig.xml内容示例 <?xml version="1.0" en ...
- 精尽Spring MVC源码分析 - 调式环境搭建
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- STL——容器(Set & multiset)的查找
1. set.find(elem); //查找elem元素,返回指向elem元素的迭代器. 1 #include <iostream> 2 #include <set> 3 4 ...
- bilibili插件推荐
目前看到的好的插件就两个,现在来介绍一下. 第一个是 哔哩哔哩助手 这是它的功能,这里就以截图来给大家看 以上为这个插件的所有功能. 点击前往官网 第二个是 bilibili网页端添加APP首页推荐 ...
- Pytest 学习(二十七)- Jenkins+Allure+Pytest的持续集成
一.配置 allure 环境变量 1.下载 allure是一个命令行工具,可以去 github 下载最新版:https://github.com/allure-framework/allure2/re ...
- PHP远程代码执行漏洞:CVE-2019-11043
漏洞详情: Nginx上fastcgi_split_path_info在处理带有 %0a 的请求时,会因为遇到换行符 \n 导致PATH_INFO为空.而php-fpm在处理PATH_INFO为空的情 ...
- CVE-2019-0708——RDP漏洞利用
影响系统:windows2003.windows2008.windows2008 R2.windows xp .win7环境:攻击机:kali ip:192.168.40.128靶机:windows ...
- 企业微信JS-SDK实现会话聊天功能
vue引入企业微信JS-SDK实现会话聊天功能 这两天在做一个对接企业微信实现会话聊天的功能, 发现企业微信文档这块儿做的不是特别详细,网上搜索也没找到特别完整的流程. 期间也踩了不少的坑, 在此进行 ...