C3P0 连接池获取的connection执行close() 方法是销毁连接还是释放资源归还连接至连接池?
C3P0 连接池获取的connection执行close() 方法是释放资源销毁连接还是释放资源归还连接至连接池?
如果你只是想要一个答案的话,可以很明确的说: 连接池的连接对象在执行clos()方法之后, 是将资源释放出来但连接不被销毁,而是重新回到C3P0 连接池中以重复使用。
代码演示如下:
## 一:C3P0 的硬编码方式演示
package com.Demo_c3p0使用_硬编码;import com.mchange.v2.c3p0.ComboPooledDataSource;import java.sql.Connection;import java.sql.PreparedStatement;
import java.sql.ResultSet;public class Hard_Coding {public static void main(String[] args) throws Exception {/*** 1. 拷贝jar包;* 2. 创建c3p0连接池对象;* 3. 获取连接对象;* 4. 预编译sql,获取预编译对象;* 5. 定义sql参数类型;* 6. 执行sql,处理结果;* 7. 释放资源(资源被释放后,连接被归还给连接池中,而不是像常规连接一样被销毁)*/
// 创建c3p0 连接池对象;ComboPooledDataSource cps = new ComboPooledDataSource();
// 定义连接属性cps.setDriverClass("com.mysql.jdbc.Driver");cps.setJdbcUrl("jdbc:mysql://localhost:3306/mydb1");cps.setUser("root");cps.setPassword("1234");
// 定义连接池中的初始连接数 (连接池连接数最小min为 3)cps.setInitialPoolSize(3);
// 获取连接对象;Connection connection = cps.getConnection();
// 预编译sql 及获取预编译对象String sql = "select * from exam where math in (?,?,?);";PreparedStatement ps = connection.prepareStatement(sql);ps.setInt(1, 89);ps.setInt(2, 85);ps.setInt(3, 91);
// 执行sql,处理结果;ResultSet resultSet = ps.executeQuery();while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");int chinese = resultSet.getInt("chinese");int math = resultSet.getInt("math");int english = resultSet.getInt("english");System.out.println(id + " " + name + " " + chinese + " " + math + " " + english);}System.out.println("被占用的连接数: " + cps.getNumBusyConnections());System.out.println("连接池中的总连接数:" + cps.getNumConnections());resultSet.close();ps.close();connection.close();Thread.sleep(60000);System.out.println("被占用的连接数: " + cps.getNumBusyConnections());System.out.println("连接池中的总连接数:" + cps.getNumConnections());}
}
执行结果如下:
值得一提的是,
如果将释放资源的代码注释掉, 可以发现
System.out.println("被占用的连接数: " + cps.getNumBusyConnections());System.out.println("连接池中的总连接数:" + cps.getNumConnections());/* resultSet.close();ps.close();connection.close();*/Thread.sleep(6000);System.out.println("被占用的连接数: " + cps.getNumBusyConnections());System.out.println("连接池中的总连接数:" + cps.getNumConnections());
那么执行结果:将资源释放代码注释掉后,即使DQL 执行完毕,连接也没有被释放
## 二:C3P0 的配置文件c3p0-config.xml 的使用方式
C3P0 的硬编码模式和通过配置文件的方式没有什么区别,配置文件的方式只是将连接的属性包装在了一个文件中,在项目其他文件需要的时候能够通过其他方式(如Dom4j 类)将配置引入。c3p0-config.xml 默认需要放在当前模块代码的src 目录下, 以供c3p0 在创建连接池的时候进行数据库相关参数数据的获取。
c3p0-config.xml 文件配置:
<!--c3p0-config.xml 文件格式内容如下,如果需要其他的参数,例如重连次数、日志输出等 -->
<c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/mydb1</property><property name="user">root</property><property name="password">1234</property><property name="initialPoolSize">6</property></default-config>
</c3p0-config>
执行结果:同硬编码方式。资源释放后,连接归还连接池。
注掉释放资源的代码后,可以发现被占用的连接不会得到释放。
C3P0 连接池获取的connection执行close() 方法是销毁连接还是释放资源归还连接至连接池?相关推荐
- 获取当前正在执行的方法的名称
本文翻译自:Getting the name of the currently executing method 有没有办法在Java中获取当前正在执行的方法的名称? #1楼 参考:https://s ...
- 【EventBus】EventBus 源码解析 ( 事件发送 | 线程池中执行订阅方法 )
文章目录 一.EventBus 中主线程支持类 二.EventBus 中 AsyncPoster 分析 三.AsyncPoster 线程池 Runnable 任务类 一.EventBus 中主线程支持 ...
- 解决SSH连接出现 Software caused connection abort 的问题
解决SSH连接出现 Software caused connection abort 的问题 参考文章: (1)解决SSH连接出现 Software caused connection abort 的 ...
- 线程池的参数及执行顺序
线程池的优点 降低系统资源消耗,通过复用已存在的线程,降低线程创建和销毁造成的开销: 提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程创建便立即能够执行. 方便线程并发数的管控, ...
- 关于MySQL连接Navicat Premium 12失败的解决方法
关于MySQL连接Navicat Premium 12失败的解决方法 参考文章: (1)关于MySQL连接Navicat Premium 12失败的解决方法 (2)https://www.cnblog ...
- MongoDB compass 连接不上远程服务器的解决方法
MongoDB compass 连接不上远程服务器的解决方法 参考文章: (1)MongoDB compass 连接不上远程服务器的解决方法 (2)https://www.cnblogs.com/li ...
- 恐怖黎明 加入好友的服务器显示不匹配,恐怖黎明连接不到好友怎么办_一直连接不到特定好友游戏解决方法分享_3DM单机...
<恐怖黎明>中一些玩家想要和好友一起游戏,却一直搜索不到好友的房间,不能加入游戏,下边就给大家带来"落雷兽"分享的一直连接不到特定好友游戏解决方法,大家可以来看一看. ...
- 计算机显示连接到多重网络,win7系统网络连接后出现多重网络的解决方法
很多小伙伴都遇到过win7系统网络连接后出现多重网络的困惑吧,一些朋友看过网上零散的win7系统网络连接后出现多重网络的处理方法,并没有完完全全明白win7系统网络连接后出现多重网络是如何解决的,今天 ...
- mysql getconnection 如何关闭连接_【MySQL】使用连接池获取Connection执行sql以及mybatis事务注意事项...
注意: 使用DataSourceUtils.getConnection(dataSource);方式获取连接,而不是dataSource.getConnection(). dataSource.get ...
最新文章
- hdu3635 Dragon Balls(带权并查集)
- 合成孔径成像算法与实现_声呐二维成像技术
- mysql-proxy安装包_Mysql-proxy安装
- [C++调试笔记]define.h
- JZOJ 5401. 【NOIP2017提高A组模拟10.8】Star Way To Heaven
- 基于Native Client的编程框架
- 第二章 物理层 2,3 数据通信基础知识 [计算机网络笔记]
- youcans 的 OpenCV 学习课—5.图像的几何变换
- 大一计算机专业,大一计算机专业学生
- php 向上取整_PHP取整方法小总结
- LVS详解(三)——LVS算法简介
- Nginx重启时丢失nginx.pid文件
- Javascript中的Trait与代码重用
- wireshark 查找内容
- 面试题:如果要画一只鸟和一个人,你会如何构图?
- C语言实现分钟转换年和天
- 3点内容介绍什么是物联网模组
- _variant_t与其他数据类型的转换
- K-Net 论文笔记
- loadrunner破解以及超级license