数据库连接池_DataSource_数据源(简单介绍C3P0和Druid)

文章目录

  • 概念
  • 好处
  • 实现
  • C3P0
    • 基本使用
    • 配置文件
  • druid
    • 下载 jar 包
    • 配置文件
    • 演示代码
  • 定义工具类
    • 示例代码

概念

数据库连接池其实就是一个容器,而这个容器其实就是一个集合,这个集合存放着多个数据库连接对象。
系统在初始化的时候,将创建一定数量的数据库连接放到连接池中。当应用程序要访问数据库的时候,会向连接池请求连接对象,访问结束后会将连接对象还给连接池。当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

数据库连接池也叫数据源,英文名叫 DataSource。

比方说创建连接池对象后,会创建 30 个连接对象放入连接池(连接池是一个集合)中,那么请求过来要和数据库取得连接,就只能从连接池获取连接对象和数据库通讯,用完后再放回连接池中,也就是说所有的用户请求共享池中30个连接对象,可以同时保持30个连接,如果连接池没有对象了,其它的连接请求只能处于等待中直到池中有连接对象为止。

好处

节约资源、数据库访问高效

以前每个请求就创建一个连接对象,那么100 万个请求就创建 100 万个连接对象,数据库可能无法承受;另外如果很多连接对象创建完后不关闭,那么就会严重占用服务器内存,当请求数量急剧上升,数据库就会崩溃掉。

因为这样的方式创建的连接对象是无法提供给其它请求使用,没有关闭就闲置在内存中,即便同一个用户发送相同的请求还是会创建一个新的连接对象,造成严重的资源浪费。另外频繁创建新的连接对象会耗费没有必要的时间和资源!

实现

标准接口:DataSource,在 javax. sql 包下的。

提供的方法:
1.获取连接:getConnection()
2.归还连接:close()。如果连接对象 Connection 是从连接池中获取的,那么调用 close() 方法则不会再关闭连接了。而是归还连接

一般我们不去实现它,由数据库厂商来实现。

1.C3P0:数据库连接池实现技术
2.Druid:数据库连接池实现技术,由阿里巴巴提供的,全球最好的连接池技术之一

C3P0

使用步骤:
1.导入jar包(两个) c3p0-0.9.5.2.jar 和 mchange - commons -java-0.2.12.jar,注意别忘了导入数据库驱动包
2.定义配置文件:
名称: c3p0.properties 或者 c3p0- config.xml
路径:将文件放在src目录下即可。
3.创建数据库连接池对象 ComboPool edDataSource
4.获取连接:getConnection

基本使用

public static void main(String[] args) {// 创建连接池对象DataSource ds = new ComboPooledDataSource();// 获取连接对象try {Connection conn = ds.getConnection();System.out.println(conn);} catch (SQLException e) {e.printStackTrace();}}

配置文件

<?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/test</property><property name="user">root</property><property name="password">123</property><!--连接池初始化的时候创建5个连接对象--><property name="initialPoolSize">5</property><!--连接池中最多存放10个连接对象--><property name="maxPoolSize">10</property><property name="checkoutTimeout">3000</property></default-config><!--其它连接配置--><named-config name="otherc3p0"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property><property name="user">root</property><property name="password">lwx83129LWX@!</property><property name="initialPoolSize">5</property><property name="maxPoolSize">10</property><property name="checkoutTimeout">3000</property></named-config>
</c3p0-config>

<named-config> 可以配置其它数据库连接信息,那么在 Java 代码中,可以指定名称来获取对应的数据库连接配置信息创建连接池对象,从而达到动态切换数据库的目的。

// 创建连接池对象
DataSource ds = new ComboPooledDataSource("otherc3p0");

druid

数据库连接池实现技术,由阿里巴巴提供的

步骤:
1.导入 jar 包 druid-1.2.8.jar
2.定义配置文件:是 properties 形式的。可以叫任意名称,可以放在任意目录下,需要手动指定文件路径
3.加载配置文件
4.获取数据库连接池对象:通过工厂类 DruidDataSourceFactory 来获取
5.获取连接对象:getConnection

下载 jar 包

下载地址:https://repo1.maven.org/maven2/com/alibaba/druid/

在这里插入图片描述
在这里插入图片描述

配置文件

# driverClassName=com.mysql.jdbc.Driver 这个驱动类已经过时了
# driverClassName=com.mysql.cj.jdbc.Driver 这个驱动类是最新的,但是驱动程序通过SPI自动注册,通常不需要手动加载驱动程序类。
# 如果是数据库在本地,且端口号是3306,则可以简写成:jdbc:mysql:///test
url=jdbc:mysql://localhost:3306/test
username=root
password=123# 连接池初始化时会生成5个连接对象
initialSize=5
# 连接池中最多10个连接对象,已经达到10个连接对象了,若继续向连接池申请连接对象会报错
maxActive=10# 等待时间,向连接池申请连接对象时,最多等待3秒种,3秒内没有获取到连接对象会报错
maxWait=3000

演示代码

 public static void main(String[] args) {// 导入jar包// 定义配置文件// 加载配置文件Properties prop = new Properties();Class<DruidDemo01> dd = DruidDemo01.class;InputStream is = dd.getClassLoader().getResourceAsStream("druid.properties");try {prop.load(is);// 创建连接池对象DataSource ds = DruidDataSourceFactory.createDataSource(prop);Connection conn = ds.getConnection();System.out.println(conn);} catch (Exception e) {e.printStackTrace();}}

定义工具类

1.定义一个类 JDBCUtils
2.提供静态代码块加载配置文件,初始化连接池对象
3.提供方法
3.1.获取连接对象方法:通过数据库连接池获取连接对象
3.2.释放资源,归还连接对象
3.3.获取连接池对象的方法

示例代码

package priv.lwx.javaex.datasource.util;import com.alibaba.druid.pool.DruidDataSourceFactory;import javax.sql.DataSource;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;/*** 使用druid连接池实现的JDBC工具类** @author liaowenxiong* @date 2021/11/18 15:30*/public class JDBCUtils {// 声明静态变量private static DataSource ds;// 通过静态代码块初始化连接池static {// 1.加载配置文件InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties");Properties prop = new Properties();try {prop.load(is);// 2.获取连接池对象ds = DruidDataSourceFactory.createDataSource(prop);} catch (Exception e) {e.printStackTrace();}}/*** 获取连接对象** @return java.sql.Connection* @author liaowenxiong* @date 2021/11/18 15:40*/public static Connection getConnection() throws SQLException {return ds.getConnection();}/*** 关闭语句对象和连接对象** @param stmt 被关闭的语句对象* @param conn 被关闭的连接对象* @return void* @author liaowenxiong* @date 2021/11/16 17:57*/public static void close(Statement stmt, Connection conn) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 关闭语句对象,释放语句对象资源** @param stmt 关闭的语句对象* @return 无* @author liaowenxiong* @date 2021/11/17 18:08*/public static void close(Statement stmt) {if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}}public static void close(ResultSet rs, Statement stmt, Connection conn) {if (rs != null) {try {rs.close();} catch (SQLException e) {e.printStackTrace();}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 释放一个连接对象,多个语句对象资源** @param conn  释放的连接对象* @param stmts 释放的多个语句对象* @return 无* @author liaowenxiong* @date 2021/11/17 18:09*/public static void close(Connection conn, Statement... stmts) {if (stmts != null && stmts.length != 0) {for (int i = 0; i < stmts.length; i++) {Statement stmt = stmts[i];close(stmt);}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}/*** 获取连接池** @return javax.sql.DataSource* @author liaowenxiong* @date 2021/11/18 15:53*/public static DataSource getDataSource() {return ds;}public static void main(String[] args) throws SQLException {}
}

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

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

相关文章

graal java_使用SparkJava和Graal的本机微服务

graal java使用SparkJava编写的微服务只是使用标准Java库的普通Java代码。 没有注释魔术&#xff0c;只有代码。 这种简单的编程风格的优点在于&#xff0c;它很简单。 非常简单&#xff0c;以至于Graal本机编译器只需编译就不会闪烁 &#xff0c;这对于例如Spring之类的更复杂…

python消息订阅_python实现发布订阅

订阅者&#xff1a;import redisrc redis.StrictRedis(host‘127.0.0.1‘, port‘6379‘, db0)ps rc.pubsub()ps.subscribe(‘lbky‘) # 从lbky订阅消息for item in ps.listen(): # 监听状态&#xff1a;有消息发布了就拿过来print(item)if item[‘type‘] ‘message‘:prin…

使用JDBC连接数据库时,SQL语句中提示:Unable to resolve table...(原因:数据源未配置)

文章目录方法一、添加数据源方法二、输入全限定表名在 IDEA 中的 Java 代码中写 SQL 语句时&#xff0c;出现如下图所示的错误提示&#xff1a;方法一、添加数据源 要解决上面红色警告的问题&#xff0c;只需要添加数据源就可以解决。 方法二、输入全限定表名 前提&#xff1…

测试反模式冰激凌模式的不足_单元测试反模式,完整列表

测试反模式冰激凌模式的不足我前段时间写过有关OOP中的反模式的文章 。 现在该写单元测试反模式了&#xff0c;因为它们也存在&#xff0c;并且有很多。 我将尝试在列表中包括我知道的每个示例。 如果您认识其他任何人&#xff0c;请通过请求请求将其添加&#xff0c;或在下面发…

mysql导入三个基本表_mysql 基础导入导出

导入导出mysqldump导出&#xff1a;mysqldump -u root -p --databases 数据库1 数据库2 > xxx.sql导入&#xff1a;系统命令行&#xff1a; MySQL -u用户名 -p密码 常见选项&#xff1a;--all-databases, -A&#xff1a; 备份所有数据库--databases, -B&#xff1a; 用于备份…

Java代码中方法的特殊修饰符/修饰词/关键字

文章目录nativesynchronizednative 用该修饰符定义的方法在类中没有实现&#xff0c;而大多数情况下该方法的实现是用C、C编写的。 synchronized 多线程的支持。用该修饰符定义的方法被调用时&#xff0c;没有其它线程能够调用该方法&#xff0c;其它的 synchronized 方法也…

aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

aws dynamodbAWS已经发布了Java版本2的AWS开发工具包 &#xff0c;该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO。 在本文中&#xff0c;我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何使用Spring Webflux堆栈公开响应式端点-这种方式&#xff0c;应用程…

centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)

1.查看操作系统相关信息。[rootlinuxidc ~]# cat /etc/issueCentOS release 6.5 (Final)Kernel \r on an \m[rootlinuxidc ~]# uname -aLinux linuxidc 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux2.创建需要下载rpm软件包的目…

对象作为参数示例java_功能Java示例 第6部分–用作参数

对象作为参数示例java这是称为“ Functional Java by Example”的系列文章的第6部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在前面的部分&#xff0c;我们试图通过移动尽可能多的副作用&#xff0c;如IO&#xff0c;该系统的外…

为什么Java在后来的版本中,给接口增加了默认方法、静态方法、私有方法?

在业务发展过程中&#xff0c;发现某个功能是所有子类都需要的&#xff0c;那么我们该怎么办&#xff1f;给接口增加抽象方法吗&#xff1f;如果直接在接口增加抽象方法&#xff0c;那么所有已经写好的具体实现类就会报编译错误。因为具体类必须实现接口的全部抽象方法。这样就…

linux 源码包安装mysql_LINUX下源码包安装mysql

tar xvfz mysql-5.1.50-linux-i686-glibc23.tar.gz -C /usr/local/解压到的目录cd /usr/local/[rootdrbd2 local]# ln -sv mysql-5.1.50-linux-i686-glibc23 mysql(创建连接)groupadd mysql 添加mysql的用户组useradd -g mysql mysql 增加mysql用户并把其加入mysql组cd mysql[r…

jdk 安全属性_系统属性的JDK 12 Javadoc标记

jdk 安全属性JDK 12 Early Access Build 20 &#xff08; 2018/11/15 &#xff09;可用&#xff0c;可以用来试用新的Javadoc标签{systemProperty} 。 新的{systemProperty} Javadoc标记在core-libs-dev邮件列表消息“ FYI&#xff1a;用于记录系统属性的新javadoc标记 ”中进行…

Lambda表达式的学习

文章目录函数式编程思想函数式接口Lambda 的使用前提Lambda 的标准格式Lambda 极简特性演示代码函数式编程思想 与面向对象编程思想的区别&#xff1a; 1.面向对象的思想是做一件事情&#xff0c;找一个能解决这个事情的对象&#xff0c;调用对象的方法来完成事情 2.函数式编程…

公证服务信息_使用多个公证员提高网络吞吐量

公证服务信息您是否需要高吞吐量的Corda网络&#xff1f; 网络的吞吐量是否稳定&#xff1f; 您是否已经从其他领域挤出了所有可能的表现&#xff1f; 如果您对这些问题的回答是“是”&#xff0c;那么我可能会为您提供一些有用的信息。 我列出了这些问题&#xff0c;以减少您过…

java判断手机号_java使用正则表达式判断手机号的方法示例

本文实例讲述了java使用正则表达式判断手机号的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;要更加准确的匹配手机号码只匹配11位数字是不够的&#xff0c;比如说就没有以144开始的号码段&#xff0c;故先要整清楚现在已经开放了多少个号码段&#xff0c;国家号…

Spring JDBC的学习

文章目录介绍使用步骤常用方法示例代码介绍 所谓 Spring JDBC&#xff0c;是 Spring 框架对 JDBC 的简单封装。提供了一个 JdbcTemplate 对象简化 JDBC 的开发。 使用步骤 步骤&#xff1a; 1.导入相关的 jar 包 2.创建 JdbcTemplate 对象&#xff0c;依赖于数据源 DataSo…

编写脚本电脑怎么编写界面_在任何无法理解的情况下,请编写脚本

编写脚本电脑怎么编写界面脚本编写是使您的应用程序在运行时就可根据客户需求进行调整的最流行的方法之一。 与往常一样&#xff0c;此方法不仅带来好处&#xff0c;例如&#xff0c;在灵活性和可管理性之间存在众所周知的折衷方案。 本文不是从理论上讨论优缺点的文章之一&…

stack java实现_Stack (堆栈)使用JAVA实现

代码如下&#xff1a;import java.util.AbstractList;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.RandomAccess;public class Stack extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable{pr…

HTML特殊符号/特殊字符

注&#xff1a;实体名称大小写敏感 点击查看更多特殊字符

访客模式 无痕模式 区别_旧访客设计模式的新生活

访客模式 无痕模式 区别介绍 访客 [1、2]是众所周知的经典设计模式。 有很多资源对其进行了详细说明。 在不深入研究实现的情况下&#xff0c;我将简要提醒一下该模式的概念&#xff0c;解释其优点和缺点&#xff0c;并提出一些可以使用Java编程语言轻松应用于其的改进。 古典…