第三方连接池

1 连接池的概念和作用

问题:连接池的本质是什么?有什么作用?

  • 概念:连接池的本质就是一个容器,该容器中会初始化一些Connection对象,我们程序只需要从连接池中获取连接,使用完毕之后归还连接即可。
  • 作用:大大减少了频繁的创建和释放连接的时间,提高数据库操作的效率

在这里插入图片描述

2.c3p0连接池[用的不多]

【1】使用步骤
【前提】导入c3p0依赖jar包[以及连接mysql-connector-java-5.1.47.jar]
c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar
【第一步】将c3p0-config.xml配置文件复制到src中(位置和名称是固定的)
【第二步】创建ComboPooledDataSource核心对象
【第三步】获取连接

  • c3p0-0.9.5.2.jar、mchange-commons-java-0.2.12.jar资源下载

【2】src目录下的属性配置文件写法
注意:如果两种配置文件都存在,优先使用xml配置文件。
<1>用c3p0-config.xml配置

c3p0-config.xml的配置文件的名称和位置是固定的,配置文件放在src目录中,配置文件中的属性名也是固定的,否则无法根据属性名或者对应的属性值。

<c3p0-config><!-- 使用默认的配置读取连接池对象 --><default-config><!--  连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc</property><property name="user">root</property><property name="password">123456</property><!-- 连接池参数 --><!--    初始化的连接数量--><property name="initialPoolSize">5</property>
<!--    最大连接数量--><property name="maxPoolSize">10</property>
<!--    超时时间--><property name="checkoutTimeout">3000</property></default-config><named-config name="oracle"> <!--  连接参数 --><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/db15</property><property name="user">root</property><property name="password">itheima</property><!-- 连接池参数 --><property name="initialPoolSize">5</property><property name="maxPoolSize">8</property><property name="checkoutTimeout">1000</property></named-config></c3p0-config>

<2>用c3p0.properties配置
属性文件的名称必须是c3p0.properties,必须放在src路径下,文件中的key是固定的,必须以c3p0.开头

#下面为mysql5.0版本 8.0版本为com.mysql.cj.jdbc.Driver
c3p0.driverClass=com.mysql.jdbc.Driver 
c3p0.jdbcUrl=jdbc:mysql://localhost/jdbc
c3p0.user=root
c3p0.password=123456
#最大连接数
c3p0.maxPoolSize=10
#超时时间单位为毫秒
c3p0.checkoutTimeout=3000

【3】c3p0连接实现代码
由于最大连接数为10,而又设置了1和10归还连接,则i=1和10会重复使用,且不会超过上限等待超时

import com.mchange.v2.c3p0.ComboPooledDataSource;
import java.sql.Connection;
import java.sql.SQLException;public class C3p0DataSourceDemo {public static void main(String[] args) throws SQLException {//1.创建连接池对象ComboPooledDataSource dataSource = new ComboPooledDataSource();//可通过配置名获取哦配置参数 上面为默认//ComboPooledDataSource dataSource = new ComboPooledDataSource("oracle");//2.获取连接//测试for (int i = 1; i <= 12; i++) {Connection conn = dataSource.getConnection();System.out.println(i+","+conn);if(i==1||i==10){conn.close();}}// 获取连接池的其他参数//获取最大连接数System.out.println("最大连接数:"+dataSource.getMaxPoolSize());}
}打印结果:
------------------------------------------------------------------------------------------
1,com.mchange.v2.c3p0.impl.NewProxyConnection@1534f01b [wrapping: com.mysql.jdbc.JDBC4Connection@78e117e3]
2,com.mchange.v2.c3p0.impl.NewProxyConnection@79b06cab [wrapping: com.mysql.jdbc.JDBC4Connection@3eb7fc54]
3,com.mchange.v2.c3p0.impl.NewProxyConnection@3c22fc4c [wrapping: com.mysql.jdbc.JDBC4Connection@78e117e3]
4,com.mchange.v2.c3p0.impl.NewProxyConnection@47d90b9e [wrapping: com.mysql.jdbc.JDBC4Connection@1184ab05]
5,com.mchange.v2.c3p0.impl.NewProxyConnection@149e0f5d [wrapping: com.mysql.jdbc.JDBC4Connection@1b1473ab]
6,com.mchange.v2.c3p0.impl.NewProxyConnection@6af93788 [wrapping: com.mysql.jdbc.JDBC4Connection@ef9296d]
7,com.mchange.v2.c3p0.impl.NewProxyConnection@7880cdf3 [wrapping: com.mysql.jdbc.JDBC4Connection@5be6e01c]
8,com.mchange.v2.c3p0.impl.NewProxyConnection@6ef888f6 [wrapping: com.mysql.jdbc.JDBC4Connection@10e92f8f]
9,com.mchange.v2.c3p0.impl.NewProxyConnection@78b66d36 [wrapping: com.mysql.jdbc.JDBC4Connection@5223e5ee]
10,com.mchange.v2.c3p0.impl.NewProxyConnection@69b2283a [wrapping: com.mysql.jdbc.JDBC4Connection@22a637e7]
11,com.mchange.v2.c3p0.impl.NewProxyConnection@1d119efb [wrapping: com.mysql.jdbc.JDBC4Connection@659a969b]
12,com.mchange.v2.c3p0.impl.NewProxyConnection@2473d930 [wrapping: com.mysql.jdbc.JDBC4Connection@22a637e7]
最大连接数:10

3.Druid连接池[常用]

【1】使用步骤
【前提】导入druid依赖jar包[以及连接mysql-connector-java-5.1.47.jar]
【第一步】在src编写配置文件,名称任意,一般叫做druid.properties
【第二步】使用Properties对象加载配置文件
【第三步】使用DruidDataSourceFactory工厂创建连接池对象
【第四步】获取连接

druid-1.0.9.jar资源下载

【2】src目录下的属性配置文件内容

#key是固定的,value根据实际情况修改
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbc
username=root
password=123456
# 初始化连接数量
initialSize=5
# 最大连接数
maxActive=10
# 等待超时时间
maxWait=3000

在src编写配置文件,名称任意,一般叫做druid.properties

【3】druid连接操纵数据库实现代码

import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.itheima.domain.Student;
import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Properties;public class DruidDemo1 {public static void main(String[] args) throws  Exception {//方式一:通过DruidDataSourceFactory对象创建连接池对象//1.通过Properties集合,加载druid.properties配置文件Properties properties = new Properties();//通过累加器获取类路径下(src)的文件输入流InputStream is = DruidDemo1.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);//2.通过Druid连接池工厂类获取数据库连接池对象DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);//3.通过连接池对象获取数据库连接进行使用Connection conn = dataSource.getConnection();System.out.println(conn);/* //方式二:直接new DruidDataSource连接池对象,硬编码。[了解]//创建连接池对象DruidDataSource dataSource = new DruidDataSource();//设置参数dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/jdbc");dataSource.setUsername("root");dataSource.setPassword("123456");//获取连接DruidPooledConnection conn = dataSource.getConnection();*///4.执行sql语句,接收结果集ArrayList<Student> list = new ArrayList<>();//获取执行对象PreparedStatement pstm = conn.prepareStatement("select * from student");//执行操作,获取结果ResultSet rs = pstm.executeQuery();//处理结果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");String birthday = rs.getString("birthday");//封住到list集合Student stu = new Student(sid, name, age, birthday);list.add(stu);}list.forEach(student -> System.out.println(student));rs.close();conn.close();//如果连接对象是从连接池中获取的,那么连接的close方法就不是关闭而是归还。pstm.close();}
}打印结果:
------------------------------------------------------------------------------------------
com.mysql.jdbc.JDBC4Connection@551bdc27
Student{sid=1, name='张三', age=23, birthday='1999-09-23'}
Student{sid=2, name='李四', age=24, birthday='1998-08-10'}
Student{sid=3, name='王五', age=25, birthday='1996-06-06'}
Student{sid=4, name='赵六', age=26, birthday='1994-10-20'}

4连接池工具类的书写

目的:将DruidDataSource连接池封装进来,对外提供获取连接和释放资源的代码

/*
目的:将DruidDataSource连接池封装进来,对外提供获取连接和释放资源的代码
*/
public class DruidDataSource {private  static  DataSource dataSource;static {try {//1.加载druid.properties属性文件(一次)Properties properties = new Properties();InputStream is = DruidDataSource.class.getClassLoader().getResourceAsStream("druid.properties");properties.load(is);//2.创建DruidDataSource连接池对象(一次)dataSource = DruidDataSourceFactory.createDataSource(properties);} catch (Exception e) {e.printStackTrace();}}//3.对外提供获取连接池的方法public  static  DataSource getDataSource(){return  dataSource;}//4.对外提供一个方法,获取连接public  static Connection getConnection() throws SQLException{return dataSource.getConnection();}//5.对外提供一个方法释放资源,同时规划连接public static void close(Connection conn, Statement stat, ResultSet rs){try {if (rs != null) {rs.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs != null) {stat.close();}} catch (SQLException e) {e.printStackTrace();}try {if (rs != null) {conn.close();}} catch (SQLException e) {e.printStackTrace();}}
}

druid获取连接测试代码

import com.itheima.domain.Student;
import com.itheima.utils.DruidDataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;public class DruidDemo2 {public static void main(String[] args) throws  Exception {Connection conn = DruidDataSource.getConnection();//4.执行sql语句,接收结果集ArrayList<Student> list = new ArrayList<>();//获取执行对象PreparedStatement pstm = conn.prepareStatement("select * from student");//执行操作,获取结果ResultSet rs = pstm.executeQuery();//处理结果while (rs.next()) {int sid = rs.getInt("sid");String name = rs.getString("name");int age = rs.getInt("age");String birthday = rs.getString("birthday");//封住到list集合Student stu = new Student(sid, name, age, birthday);list.add(stu);}list.forEach(student -> System.out.println(student));//如果连接对象是从连接池中获取的,那么连接的close方法就不是关闭而是归还。DruidDataSource.close(conn,pstm,rs);}
}打印结果:
------------------------------------------------------------------------------------------
com.mysql.jdbc.JDBC4Connection@58fdd99
Student{sid=1, name='张三', age=23, birthday='1999-09-23'}
Student{sid=2, name='李四', age=24, birthday='1998-08-10'}
Student{sid=3, name='王五', age=25, birthday='1996-06-06'}
Student{sid=4, name='赵六', age=26, birthday='1994-10-20'}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330679.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

think-in-java(9)接口

【9】接口 【9.1】抽象类和抽象方法1&#xff09;抽象方法&#xff1a;仅有方法声明而没有方法体&#xff1b;由abstract 修饰的方法&#xff1b;2&#xff09;抽象类&#xff1a;如果一个类包含一个或多个抽象方法&#xff0c; 则该类声明为抽象类&#xff0c;由 abstract修饰…

Spring Boot日志集成

转载自 Spring Boot日志集成Spring Boot日志框架 Spring Boot支持Java Util Logging,Log4j2,Lockback作为日志框架&#xff0c;如果你使用starters启动器&#xff0c;Spring Boot将使用Logback作为默认日志框架。无论使用哪种日志框架&#xff0c;Spring Boot都支持配置将日志输…

三大设计模式

1. 装饰者设计模式 <1>解决的问题&#xff1a;在不改变原有类方法源代码的情况下给方法进行增强&#xff0c;在实现的方法中调用原有对象的对应方法&#xff0c;也可对原有方法进行增强。 <2>要求&#xff1a;要实现接口的所有方法。 <3>弊端&#xff1a;…

硬盘与存储设备

转自鸟哥&#xff1a; http://cn.linux.vbird.org/linux_basic/0105computers_2.php#pc_hd 【1】基本概念 实际的数据都是写在具有磁性物质的磁碟盘上头&#xff0c;而读写主要是透过在机械手臂上的读取头(head)来达成。 实际运作时&#xff0c; 主轴马达让磁碟盘转动&#x…

17张图揭密支付宝系统架构

转载自 17张图揭密支付宝系统架构 支付宝的系统架构图&#xff0c;仅供参考。不管是不是支付行业&#xff0c;都值得我们参考&#xff0c;学习。

Linux系统分区和挂载浅谈

转自&#xff1a; https://blog.csdn.net/cc_net/article/details/2894510好久没有写BLOG了,之前出差了2个月,都没怎么看书,也没有太多时间写。回来后一个月人也有点放松。现在开始还是得继续努力啊。不废话了&#xff0c;下面就介绍下Linux系统的分区和挂载 一 Linux的安装 L…

jmap, jhat, jvisualvm:java堆内存对象分析利器

转载自 jmap, jhat, jvisualvm&#xff1a;java堆内存对象分析利器jmap -help查看命令用法。jmap -heap <pid> 查看堆使用情况。jmap -dump导出堆对象文件进行内存分析。jhat -J-Xmx512m -port 8888 1136.txt命令生成分析报告&#xff0c;可通过http访问。访问http://loc…

ajax异步请求

1 什么是异步请求&#xff1f; 在页面不重新加载的情况下&#xff0c;发送请求局部更新页面内容。2 jquery实现异步请求&#xff1f; $.ajax({url:"访问路径",data:"请求参数", //请求参数格式:"namevalue&namevalue&..." 或者 {name:…

Buffers与cached啥区别

转自&#xff1a; https://www.cnblogs.com/argb/p/3448744.html A buffer is something that has yet to be “written” to disk.A cache is something that has been “read” from the disk and stored for later use对于应用程序来说&#xff0c;buffers/cached 是等于可用…

Spring面试题(第一期)

转载自 Spring面试题&#xff08;第一期&#xff09;Spring作为现在最流行的java web开发框架&#xff0c;Spring的应用及其原理的深入了解是每个Java开发程序员必经之路&#xff0c;下面10道面试题是Java开发程序员面试时会经常遇到的题目。 1、为什么要使用Spring框架&#x…

vue的基本语法

vue的基本语法 new Vue({el:"css选择器",//表示vue对象接管的区域&#xff0c;只有在这一块区域内才可以使用vue的方法显示数据。data:{// 定义各种变量&#xff0c;将来变量的值在页面html标签中使用。name:"snake",age:20,user:{username:"jack&quo…

linux-basic(6)linux的文件权限与目录配置

【6.1】用户与用户组 1&#xff09;linux用户身份与用户组记录的文件/etc/passwd 默认情况下所有系统上的账号都记录在该文件&#xff1b;/etc/shadow 用户密码记录在该文件下&#xff1b;/etc/group linux的所有组名记录在该文件下&#xff1b;注意&#xff1a;这3个文件是 li…

阿里巴巴对Java编程【异常处理】的规约

转载自 阿里巴巴对Java编程【异常处理】的规约 异常处理 1. 【强制】 Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避&#xff0c;而不应该通过 catch 来处理&#xff0c;比如&#xff1a; IndexOutOfBoundsException &#xff0c; NullPointerException 等…

Http协议的请求和响应

1.HTTP协议介绍 HTTP(HyperTextTransferProtocol)&#xff1a;超文本传输协议。HTTP协议是基于TCP/IP协议的。基于请求/响应模型的: 一次请求对应一次响应。传输协议&#xff1a;客户端和服务器端的通信规则(握手规则)。 2.HTTP协议的请求 HTTP协议规定了客户端发给服务器的数…

centos上安装jdk

1&#xff09;下载jdk&#xff1a; http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2&#xff09;放置到/usr/local/software/java 目录下&#xff0c;并解压 tar-xzv -f jdk*.gz 3&#xff09;配置环境变量 vim /etc/profile 追…

阿里巴巴对Java编程【单元测试】的规约

转载自 阿里巴巴对Java编程【单元测试】的规约 单元测试 1. 【强制】好的单元测试必须遵守 AIR 原则。 说明&#xff1a;单元测试在线上运行时&#xff0c;感觉像空气 &#xff08;AIR&#xff09; 一样并不存在&#xff0c;但在测试质量的保障上&#xff0c;却是非常关键的。好…

linux-basic(7)linux文件与目录管理

【7.1】目录与路径 【7.1.2】目录相关操作1&#xff09;特殊目录列表&#xff1a;(1)2&#xff09;目录操作命令&#xff0c;底下我们就来谈一谈几个常见的处理目录的命令吧&#xff1a;cd&#xff1a;变换目录pwd&#xff1a;显示目前的目录mkdir&#xff1a;创建一个新的目录…

Get和Post请求和对应的参数获取

1.get和post的请求方式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>vue的异步请求</title><script src"js/vue.js"></script><!--vue单独抽取的插件--><sc…

阿里巴巴对Java编程【安全规约】的规约

转载自 阿里巴巴对Java编程【安全规约】的规约 安全规约 1. 【强制】隶属于用户个人的页面或者功能必须进行权限控制校验。 说明&#xff1a;防止没有做水平权限校验就可随意访问、修改、删除别人的数据&#xff0c;比如查看他人的私信内容、修改他人的订单。 2. 【强制】用户敏…

JSON转换工具---jackson

1.json传递中和javaBean对象的关系 打印出来的字符串&#xff0c;对象和键值集合用{}, 数组和用[] 2.json的转换 总测试类:以下转换都为单元测试方法 public class ObjectMapperTest {private ObjectMapper mapper new ObjectMapper(); }<1>json和对象的转换 /*1.Use…