数据库连接池-c3p0
一、简介
C3P0是一JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。使用它的开源项目有Hibernate、Spring等。
c3p0与dbcp区别:
- dbcp没有自动回收空闲连接的功能
- c3p0有自动回收空闲连接功能
数据库连接池的重要性:
当我们在进行基于数据库的web程序开发时,我们可以先在主程序(如Servlet、Bean)中通过JDBC中的DriverManager建立数据库连接,然后将要对数据库进行操作的sql语句封装到Statement中,最后在返回结果集后断开数据库连接。以上是较为传统的开发模式,然而用这种模式开发会埋下严重的安全隐患。
JDBC传统模式开发存在的主要问题:
- 时间和内存资源消耗巨大
普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再根据JDBC代码(或配置文件)中的用户名和密码进行验证其正确性。这一过程一般会花费0.05~1s,一旦需要数据库连接的时候就必须向数据库请求一个,执行完后再断开连接。显然,如果同一个数据库在同一时间有数十人甚至上百人请求连接势必会占用大量的系统资源,严重的会导致服务器崩溃。
- 有内存泄漏的风险
因为每一次数据库连接使用完后都需要断开连接,但如果程序出现异常致使连接未能及时关闭,这样就可能导致内存泄漏,最终只能以重启数据库的方法来解决;
另外使用传统JDBC模式开发不能控制需要创建的连接数,系统一般会将资源大量分出给连接以防止资源不够用,如果连接数超出一定数量也会有极大的可能导致内存泄漏。
二、导入jar包
百度网盘 请输入提取码
提取码:xbb8
三、编码测试
1)编写配置文件
<?xml version="1.0" encoding="UTF-8"?><c3p0-config><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true</property><property name="user">xxxx</property><property name="password">xxxx</property><property name="initialPoolSize">5</property><property name="maxIdleTime">10</property><property name="maxPoolSize">5</property><property name="minPoolSize">20</property></default-config><named-config name="MySQL"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy</property><property name="user">xxxx</property><property name="password">xxxx</property><property name="initialPoolSize">5</property><property name="maxIdleTime">10</property><property name="maxPoolSize">5</property><property name="minPoolSize">20</property></named-config></c3p0-config>
2)改写工具类
import com.jdbc.study04.JdbcUtils;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;import java.io.InputStream;
import java.sql.*;
import java.util.Properties;public class JdbcUtils_DBCP {private static BasicDataSource dataSource=null;static {try{InputStream in = JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");Properties properties = new Properties();properties.load(in);//创建数据源 (工厂模式)dataSource = BasicDataSourceFactory.createDataSource(properties);}catch (Exception e){e.printStackTrace();}}//获取连接 数据源中自带连接public static Connection getConnection() throws SQLException {return dataSource.getConnection();}public static void release(Connection conn,Statement st,ResultSet rs){if(rs!=null){try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if(st!=null){try {st.close();} catch (SQLException e) {e.printStackTrace();}}if(conn!=null){try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}
}
3)代码测试
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class TestC3P0 {public static void main(String[] args) {Connection conn=null;PreparedStatement st=null;try {conn = JdbcUtils_C3P0.getConnection();String sql="insert into users(`id`,`NAME`,`PASSWORD`,`email`,`birthday`) value (?,?,?,?,?)";st=conn.prepareStatement(sql);st.setInt(1,5);st.setString(2,"alife");st.setString(3,"123456");st.setString(4,"alife@qq.com");st.setDate(5,new Date(new java.util.Date().getTime()));int i = st.executeUpdate();if(i>0){System.out.println("插入成功");}} catch (SQLException e) {e.printStackTrace();}finally {JdbcUtils_C3P0.release(conn,st,null);}}
}
总结:
无论使用什么数据源,本质还是一样的,只要DataSource接口不变,方法就不会变
数据库连接池-c3p0相关推荐
- c3p0 mysql 连接池配置文件_数据库连接池c3p0的使用
原标题:数据库连接池c3p0的使用 来源:java联盟 https://mp.weixin.qq.com/s/5Tbkf8dVFfH8AvtqWl-7Xg 程序员共读整理发布,转载请联系作者获得授权 ...
- 数据库连接池——C3P0:数据库连接池技术
数据库连接池 1. 概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接 ...
- Java数据库连接池c3p0和druid
目录 一.举例解释连接池 二.c3p0 三.druid 一.举例解释连接池 一直用jdbc的我突然发现一个好东西,那就是连接池,举一个不恰当的例子来说说jdbc和连接池的区别 比如有一家餐馆,如果是j ...
- 通过实现ServletContextListener接口创建数据库连接池(C3P0方式)
使用Listener步骤 1. 定义Listener实现类 2. 在web.xml中配置(或使用Annotation) 使用C3P0方式创建数据库连接池需要添加的jar包 1.c3p0-0.9.5.j ...
- 数据库连接池 C3p0
数据库连接池 C3po 1 定义 本质上是个容器(集合) 存放数据库的连接容器(connection 对象) ,当系统初始化以后 容器就会创建 容器中就会申请一些连接对象 ,当用户来访问数据库的时候 ...
- 数据库连接池C3P0详细介绍
数据库连接池 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的 ...
- 数据库连接池c3p0常用配置说明
1.最常用配置 initialPoolSize: 连接池初始化时创建的连接数,default : 3(建议使用) minPoolSize: 连接池保持的最小连接数,default : ...
- 数据库连接池c3p0数据库连接池
文章目录 1.前提准备: 1.1创建数据库 1.2创建实体类对象 1.3 JDBC工具类 2.基于jdbc工具类将数据封装到实体类中 3.c3p0连接池的使用 3.1c3p0的使用步骤 3.2创建项目 ...
- Java 数据库连接池C3P0,德鲁伊(Druid)的详解
博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家,
最新文章
- 自助分析平台(一):快速入门三种数据可视化插件
- MySQL之INSERT
- ABAP日期函数(求月末日,第几周,search help 只显示年月) 使用方法实例
- 在几何画板中如何制作圆柱的侧面展开动画_倒计时与时钟演示 | 几何画板
- (C++版)链表(四)——实现双向循环链表创建、插入、删除等简单操作
- 前端学习(417):京东制作页面25中间部分的准备工作
- phpcmsV9栏目内文章批量移动后,新的内容页模板不生效 -分析篇
- Helm 3 完整教程(十七):Helm 流控制结构(1)if / else 语句
- 【Flutter】基础组件【05】Icon
- 我的第一场比赛——金马五校赛
- 将 azw3 格式转换为 epub和mobi 格式
- python小游戏编程arcade----坦克动画图片合成
- 基于Matlab的三角函数方程组解算方法
- 使用vscode remote ssh功能远程连接服务器或树莓派时,报错Setting up SSH tunnel的终极解决办法,全网仅此一份
- c语言求abc大小时要怎么输入,C语言 有3个数a,b,c,要求按大小顺序把它们输出。,急!!!!!有三个数abc,要求按大小顺序输出. 请问用C语...
- 【Educoder作业】绘制炸弹轨迹 I——绘制一个坐标点
- linux系统内存dump机制介绍(一)--kdump
- STM32 中断向量表的位置 、重定向
- 京东入职一周感悟:4个匹配和4个观点
- github上值得关注的前端项目