常用数据库连接池配置及使用

世上没有从天而降的英雄,只有挺身而出的凡人。

——致敬,那些在疫情中为我们挺身而出的人。

运行环境

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:

如果,您希望更容易地发现我的新博客,不妨点击一下关注。

如果你觉得本篇文章对你有所帮助,请给予我更多的鼓励,

因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【肥肥也】!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容