常用数据库连接池配置及使用(Day_11)
世上没有从天而降的英雄,只有挺身而出的凡人。
——致敬,那些在疫情中为我们挺身而出的人。
运行环境
JDK8 + IntelliJ IDEA 2018.3
优点:
使用连接池的最主要的优点是性能。创建一个新的数据库连接所耗费的时间主要取决于网络的速
度以及应用程序和数据库服务器的(网络)距离,而且这个过程通常是一个很耗时的过程。而采用
数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到
数据库服务器,这样就节省了时间。
缺点:
数据库连接池中可能存在着多个没有被使用的连接一直连接着数据库(这意味着资源的浪费)
一、导包
xml文件:
1 <?xml version="1.0" encoding="UTF-8"?>
2 <project xmlns="http://maven.apache.org/POM/4.0.0"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5 <modelVersion>4.0.0</modelVersion>
6
7 <groupId>com.papercy</groupId>
8 <artifactId>DBCP</artifactId>
9 <version>1.0-SNAPSHOT</version>
10 <dependencies>
11 <dependency>
12 <groupId>mysql</groupId>
13 <artifactId>mysql-connector-java</artifactId>
14 <version>5.1.48</version>
15 </dependency>
16
17 <!--C3P0-->
18 <dependency>
19 <groupId>c3p0</groupId>
20 <artifactId>c3p0</artifactId>
21 <version>0.9.1.1</version>
22 </dependency>
23 <!--DBCP -->
24 <dependency>
25 <groupId>commons-dbcp</groupId>
26 <artifactId>commons-dbcp</artifactId>
27 <version>1.4</version>
28 </dependency>
29
30 <dependency>
31 <groupId>commons-pool</groupId>
32 <artifactId>commons-pool</artifactId>
33 <version>1.5.7</version>
34 </dependency>
35
36 <dependency>
37 <groupId>junit</groupId>
38 <artifactId>junit</artifactId>
39 <version>4.13</version>
40 </dependency>
41
42 <!-- https://mvnrepository.com/artifact/com.mchange/mchange-commons-java -->
43 <dependency>
44 <groupId>com.mchange</groupId>
45 <artifactId>mchange-commons-java</artifactId>
46 <version>0.2.15</version>
47 </dependency>
48 </dependencies>
49
50 </project>
二、DBCP
DBUtil 类
1 package com.papercy;
2
3 import org.apache.commons.dbcp.BasicDataSource;
4
5 public class DBCPUtils {
6 private static String DRIVER="com.mysql.jdbc.Driver";
7 private static String URL="jdbc:mysql://localhost/lob?useUnicode=true&characterEncoding=utf8";
8 private static String USERNAME="root";
9 private static String PASSWORD="123456";
10
11 //获取BasicDataSource并配置,开始....
12 private static BasicDataSource basicDataSource=new BasicDataSource();
13 static {
14 basicDataSource.setUrl(URL);
15 basicDataSource.setUsername(USERNAME);
16 basicDataSource.setPassword(PASSWORD);
17 basicDataSource.setInitialSize(10);//初始化创建十个链接
18 basicDataSource.setMaxActive(10);//允许同时10个活动连接数
19 basicDataSource.setMaxIdle(8);//最大空闲连接数
20 basicDataSource.setMinIdle(1);//最小空闲连接数
21
22 }
23
24 public static BasicDataSource getBasicDataSource(){
25 return basicDataSource;
26 }
27 }
测试类
1 package com.papercy;
2
3 import java.sql.Connection;
4 import java.sql.PreparedStatement;
5 import java.sql.SQLException;
6
7 public class TestDBUtil {
8 public static void main(String[] args) {
9 try {
10 Connection conn=DbcpDBUtil.getDataSource().getConnection();
11 String sql="INSERT INTO student(id,`name`,age) VALUES(NULL,?,?)";
12 PreparedStatement preparedStatement=conn.prepareStatement(sql);
13 preparedStatement.setString(1,"feifeiye");
14 preparedStatement.setInt(2,88);
15 int count=preparedStatement.executeUpdate();
16
17 if (count>0){
18 System.out.println("插入成功");
19 }else{
20 System.out.println("插入失败");
21 }
22
23 } catch (SQLException e) {
24 e.printStackTrace();
25 }
26 }
27 }
注:其中的Close方法不会真正的将连接关闭,而是将其放回到连接池中,对于所有的数据源一般都会改写此方法(使用修饰)。
方式二:使用BasicDataSourceFactory +配置文件
配置文件dbcp.properties:
1 diverClassName=com.mysql.jdbc.Driver
2 url=jdbc:mysql://localhost:3306/lob?useUnicode=true&characterEncoding=utf8
3 user=root
4 pwd=123456
1 package com.papercy;
2
3 import org.apache.commons.dbcp.BasicDataSourceFactory;
4
5
6 import javax.sql.DataSource;
7 import java.io.FileInputStream;
8 import java.io.FileNotFoundException;
9 import java.io.IOException;
10 import java.io.InputStream;
11 import java.util.Properties;
12
13 public class DbcpDBUtil {
14 public static DataSource getDataSource(){
15 Properties properties=new Properties();
16 String path="src/dbcp.properties";
17 try {
18 InputStream inputStream=new FileInputStream(path);
19 properties.load(inputStream);
20 } catch (FileNotFoundException e) {
21 e.printStackTrace();
22 } catch (IOException e) {
23 e.printStackTrace();
24 }
25
26
27 DataSource dataSource=null;
28 try {
29 dataSource= new BasicDataSourceFactory().createDataSource(properties);
30 } catch (Exception e) {
31 e.printStackTrace();
32 }
33 return dataSource;
34 }
35 }
三、C3P0
C3P0Util类
1 package com.papercy.c3p0;
2
3 import com.mchange.v2.c3p0.ComboPooledDataSource;
4
5 import javax.sql.DataSource;
6 import java.sql.Connection;
7 import java.sql.PreparedStatement;
8 import java.sql.ResultSet;
9 import java.sql.SQLException;
10
11 /**
12 * C3P0工具类
13 */
14 public class C3p0Utils {
15 //定义数据源对象
16 private static DataSource dataSource;
17 //获取数据源
18 static {
19 dataSource=new ComboPooledDataSource();
20 }
21 //通过数据源获取数据库连接
22 public static Connection getConnection(){
23 try {
24 return dataSource.getConnection();
25 } catch (SQLException e) {
26 e.printStackTrace();
27 return null;
28 }
29 }
30 //关闭预处理对象和结果集对象
31 public static void close(PreparedStatement preparedStatement, ResultSet resultSet){
32 if (resultSet!=null){
33 try {
34 resultSet.close();
35 } catch (SQLException e) {
36 e.printStackTrace();
37 }
38 }
39
40 if (preparedStatement!=null){
41 try {
42 preparedStatement.close();
43 } catch (SQLException e) {
44 e.printStackTrace();
45 }
46 }
47
48 }
49 }
C3P0测试类
1 package com.papercy.c3p0;
2
3 import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
4
5 import java.sql.Connection;
6 import java.sql.PreparedStatement;
7 import java.sql.ResultSet;
8 import java.sql.SQLException;
9
10 /**
11 * 测试C3P0
12 */
13 public class TestC3p0Pools {
14 public static void main(String[] args) {
15 Connection conn=C3p0Utils.getConnection();
16 String sql="SELECT * FROM EMPLOYEES";
17 PreparedStatement preparedStatement=null;
18 ResultSet resultSet=null;
19 try {
20 preparedStatement=conn.prepareStatement(sql);
21 resultSet=preparedStatement.executeQuery();
22 while(resultSet.next()){
23 int id=resultSet.getInt("EID");
24 String firstName=resultSet.getString("FIRSTNAME");
25 String lastName=resultSet.getString("LASTNAME");
26 int age=resultSet.getInt("AGE");
27 System.out.println(id+"\t"+firstName+"\t"+lastName+"\t"+age);
28 }
29 } catch (SQLException e) {
30 e.printStackTrace();
31 }finally {
32 C3p0Utils.close(preparedStatement,resultSet);
33 }
34 }
35 }
注:
- acquireIncrement: 声明当连接池中连接耗尽时再一次新生成多少个连接,默认为3个
- initialPoolSize: 当连接池启动时,初始化连接的个数,必须在minPoolSize~maxPoolSize之间,默认为3
- minPoolSize: 任何时间连接池中保存的最小连接数,默认3
- maxPoolSize: 在任何时间连接池中所能拥有的最大连接数,默认15
- maxIdleTime: 超过多长时间连接自动销毁,默认为0,即永远不会自动销毁
PS:
如果,您希望更容易地发现我的新博客,不妨点击一下关注。
如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,
因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!
常用数据库连接池配置及使用(Day_11)的更多相关文章
- Tomcat6.0数据库连接池配置
http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库 ...
- 【Java】java数据库连接池配置的几种方法
今天遇到了关于数据源连接池配置的问题,发现有很多种方式可以配置,现总结如下,希望对大家有所帮助:(已Mysql数据库为例) 一,Tomcat配置数据源: 方式一:在WebRoot下面建文件夹META- ...
- Tomcat数据库连接池配置
Tomcat数据库连接池配置 1. Server.xml的配置 (1)找到tomcat所在目录下的conf\server.xml文件 (2)在文件最后一个</host> ...
- 数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前
数据库连接池配置(案例及排查指南) 原创: 有赞技术 有赞coder 4天前
- Spring + MyBatis中常用的数据库连接池配置总结
Spring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0.可以在Spring配置文件中利用这两者中任何一个配置数据源. DBCP数据源 DBCP类包位于 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- java常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- DataSource - 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
- 常用数据库连接池 (DBCP、c3p0、Druid) 配置说明.RP
1. 引言 1.1 定义 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库 ...
随机推荐
- 死磕Spring之AOP篇 - Spring AOP自动代理(一)入口
该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...
- GO-02-helloworld
package main /** package main表示一个可独立执行的程序,每个Go应用程序都需要包含一个名为main的包, 并且该包包含一个叫main()的函数(该函数是Go可执行程序的执行 ...
- 一文完全掌握 Go math/rand
Go 获取随机数是开发中经常会用到的功能, 不过这个里面还是有一些坑存在的, 本文将完全剖析 Go math/rand, 让你轻松使用 Go Rand. 开篇一问: 你觉得 rand 会 panic ...
- ASP.NET Core扩展库之Http请求模拟
如今,完全独立的业务应用几乎不存在,不管是在企业内部微服务之间的调用,还是与外部第三方服务的调用,Http的API交互是常见的场景,这些实际情况给我们的开发带来了比较大的挑战,一是第三方服务可能会牵制 ...
- 计算机网络——RIP协议:距离向量算法
路由信息协议(RIP)是内部网关协议(IGP)中使用最广泛的一种协议,它是一种分布式.基于距离向量的路由选择协议,其特点是协议简单.它要求路由器周期性地向外发送路由刷新报文.路由刷新报文主要内容是由若 ...
- 测开需要熟悉的Linux基本知识
安装软件-编辑 yum -y install 安装软件-上传下载 yum -y install lrzsz 查看当前目录 ls 查看所有 ls -a 创建一个文件夹 mkdir Foldername ...
- 关于width的继承和获取
absolute元素(如果没有设置width值),其宽度自适应于内部元素, <!DOCTYPE html> <html lang="en"> <hea ...
- Python中的时间日期模块(time、datetime)
目录 Datetime 获取当前时间 获取当前日期 获取当前时间的tuple元组 格式化日期和时间 时间移动 获取两个时间的时间差 时间格式转换 Time 获取距元年(1970.1.1)的秒数 当时时 ...
- POJ3762 时间段用k次
题意: 有n个任务,每个任务有自己的开始时间和结束时间,还有完成这个任务能获得的价值,然后每一天的同一个时刻只能执行一个任务,每个任务必须连续执行完成,最多可以工作m天,问这m天能获得的最 ...
- Day009 面向对象和方法回顾
面向过程&面向对象 面向过程思想 步骤清晰简单,第一步做什么,第二步做什么..... 面象过程适合处理一些较为简单的问题 面向对象思想 物以类聚,分类的思维模式,思考问题首先会解决问题需要哪些 ...