世界观天下!「数据库、数据库连接池、数据源」这些概念你真的理解了吗?
我学习的过程中,对于连接池和数据源分得不是很清楚,而且我发现有的人将数据库等同于数据源,或者将数据源等同于连接池,实际上这些说法并不准确。
在某次工作中,同事 A 说道,这个数据源不行,那么换一个数据源就可以了,结果我看他操作,原来是改写了配置中的数据库连接的 URL,当时我在想,这就是换数据源了?我以为说是把 Druid 这个数据源换掉。至于为什么会这么想,主要是因为有个 DruidDataSource。
现在,搞清楚它们的区别不妨听我说说,欢迎大家在评论区说出你的看法!
(资料图片)
数据库一提到数据库,大家都会想到 MySQL、Oracle、PostgreSQL 这些。我们也习惯这样讲:我这个项目的数据库使用的是 MySQL,是吧。
实际上,严格来讲,这些是数据库管理系统(Database Management System,DBMS),它们是一种可以操作和管理数据库(Database)的软件。真正的数据库是指存储数据的仓库,这些数据都是持久化存储在计算机的硬盘上的。
比如 MySQL,我们在 MySQL 客户端使用 CREATE DATABASE db_demo;
命令,这样就创建了一个名为 db_demo
的数据库。
我们可以使用 SHOW VARIABLES LIKE "%datadir";
命令查看数据库存放在哪个地方。
那什么是数据库连接池呢?在说什么是连接池之前,我们先说说什么是连接(Connection、Connect)。
连接在一开始学习 MySQL 的时候,我们通过 MySQL 的客户端来连接上 MySQL 的服务端:
mysql -u root -p 123456
当出现如下输出时,就说明我们成功连接上 MySQL 的服务端,接着就能输入各种 SQL 语句了:
Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 81Server version: 5.7.39 MySQL Community Server (GPL)Copyright (c) 2000, 2022, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type "help;" or "\h" for help. Type "\c" to clear the current input statement.mysql>
以上的连接,只是连接到 MySQL 服务端,并没有指定连接到哪一个数据库,当然我们可以通过 USE 数据库名称
来切换到指定的数据库,后续的操作都是在该数据库上进行。
此处的连接,是一个动作,即 Connect。
我们在学习 JDBC 的时候,知道了想要通过 Java 去操作数据库,那么就需要借助 JDBC 来操作。
在这个过程中,我们首先需要加载数据库的驱动,然后建立 Java 程序与某个数据库的连接:
String driver = "com.mysql.jdbc.Driver";String url = "jdbc:mysql://localhost:3306/db_demo";String username = "root";String password = "123456";// 加载驱动Class.forName(driver);// 获取该数据库连接(即帮我们创建了一个可以操作db_demo的连接对象)Connection conn = DriverManager.getConnection(url, username, password);
获取完之后,我们就能通过连接获取相关的 Statement 对象(比如预编译的 PreparedStatement 对象),将我们的 SQL 语句丢给 Statement 对象,通过 Statement 对象执行操作。
操作完毕后就关闭了数据库连接。
conn.close();
这里的连接,是一个动作,也是一个对象,因为 Java 是面向对象的,抽象出了一个连接对象,这个连接对象包含了驱动信息、连接的 URL、DBMS 的用户名和密码,主要表明了此次连接到的是哪个数据库。
池化技术现在,我们每进行一次相关的数据库操作,就需要经过打开/建立连接,执行相关操作,销毁/关闭连接这么一个过程。
对于一个简单的、对数据库的操作不是很频繁的应用来说,问题不大,不会有很明显的性能开销。
但是,对于一个经常操作数据库的应用来说,当有许多操作的请求过来时,多次的创建与销毁连接对象,是相当耗费资源的,比如网络带宽,内存,CPU 的运算等等。当然除了耗费资源,创建与销毁也会耗费时间。所以就有了数据库连接池的出现,这种是属于「池化技术」。
池化技术有这样的特点,就是提前准备,然后进行复用。对于数据库连接池,就是提前准备好一定量的连接对象放在一个「池子」中,你可以想象水池,有一定量的水。当有需要的时候,就从这个池子中获取连接对象,然后进行数据库的操作,操作完了后,就把对象放回池子中。这就是所谓的「数据库连接池」。
这里也就有种用空间换时间的感觉,通过准备一定量的连接对象,避免由调用者手动去打开和关闭连接,进而提高效率。
自己实现一个数据库连接池选择你喜欢的一个地方新建一个类和一个配置文件,我将这两个东西放在了同一个目录下:
db.properties:
# 数据库相关配置driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/db_one_demousername=rootpassword=123456# 初始化的数据库连接池大小initialPoolSize=5
ConnectionPool.java:
/** * @author god23bin * @description 简单的数据库连接池 */public class ConnectionPool { private static String driver; private static String url; private static String username; private static String password; /** * 使用一个List来存放连接,将这个List作为连接池 **/ private static List connectionPool; /** * 标记对应的连接是否被使用,是为 true,否为 false **/ private static List usedConnections; /** * 连接池大小,即池子中连接的个数 **/ private static int initialPoolSize; // 读取配置文件只需要一次就够了,所以用static代码块 static { //读取文件配置 InputStream inputStream = null; Properties properties = new Properties(); try { // 如果你的是 Spring Boot 应用,db.properties 放在 resource 目录下,则可以通过 ClassPathResource 来获取这个配置文件 // inputStream = new ClassPathResource("db.properties").getInputStream(); inputStream = ConnectionPool.class.getClassLoader().getResourceAsStream("db.properties"); properties.load(inputStream); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); initialPoolSize = Integer.parseInt(properties.getProperty("initialPoolSize")); connectionPool = new ArrayList<>(initialPoolSize); usedConnections = new ArrayList<>(initialPoolSize); // 加载驱动 Class.forName(driver); // 创建连接并将连接放到List集合中,标记为未被使用 for (int i = 0; i < initialPoolSize; i++) { Connection connection = DriverManager.getConnection(url, username, password); connectionPool.add(connection); usedConnections.add(false); } } catch (IOException | SQLException | ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取连接 * @return java.sql.Connection 返回连接对象 **/ public synchronized Connection getConnection() throws SQLException { // 判断是否有空闲的连接可用,有的话就标记为使用中,接着返回这个连接 for (int i = 0; i < initialPoolSize; i++) { if (!usedConnections.get(i)) { usedConnections.set(i, true); return connectionPool.get(i); } } // 如果没有可用的连接,那么创建一个新的连接,把它加入到池中,并返回,简单处理,这里的创建并没有上限 Connection connection = DriverManager.getConnection(url, username, password); connectionPool.add(connection); usedConnections.add(true); initialPoolSize++; return connection; } /** * 释放连接,将其标记为未使用 * @param connection 连接 **/ public synchronized void releaseConnection(Connection connection) { int index = connectionPool.indexOf(connection); usedConnections.set(index, false); }}
目前我知道的开源的数据库连接池有 DBCP、C3P0,还有阿里的 Druid。
数据源数据源(Data Source),即数据的来源。在咱们开发的应用中,数据可以来源于网络,也可以来源于本地的文件,还可以来源于数据库。
简而言之,数据源指定了数据从哪里来。换句话说,数据源是指存储数据的位置。
在 Java 中,有一个 javax.sql.DataSource
接口,这个接口定义了一组获取数据库连接的方法。
Connection getConnection() throws SQLException
Connection getConnection(String username, String password) throws SQLException
以上,就是所谓的数据源。
数据源和连接池的关系有的人会把数据源等同于连接池,那到底是不是呢?从概念上看,明显不是一个东西,数据源是数据来源,连接池则是连接的缓存池,用于存储和管理数据库连接。
我认为,出现这种看法是因为我们在配置数据源的时候,把连接池也进行了相关的配置。所以才会把数据源等同于连接池。
不过,虽然不是同个东西,但是数据源和连接池是紧密相关的,它们一起协同工作来管理数据库连接并提供访问数据库的功能。
在日常开发中,数据源除了指数据来自哪里,还可以有其他信息!对于数据源对象来说,它定义了数据库连接参数以及连接数据库所需的所有信息,例如数据库服务器的地址、用户名和密码等。
有的连接池,会从数据源对象中获取连接参数并使用它们来创建和管理数据库连接,就比如当我们在项目中使用开源的数据库连接池的时候,就需要进行相关的配置。对于开源的数据库连接池,它们都具有实现 Java 的标准数据源接口 javax.sql.DataSource
的类,可以直接使用。
以 Druid 为例,这个类是 com.alibaba.druid.pool.DruidDataSource
,可以用于创建和管理数据库连接。
在我看来,Druid 是一个既包含数据源功能又包含连接池功能的开源项目。它可以用作数据源,通过配置和管理连接池来提供访问数据库的功能。Druid 提供了一组高效的连接池和监控工具,可用于管理和监控数据库连接。
https://github.com/alibaba/druid/wiki/DruidDataSource配置
这里给出 Druid 的一些配置:
从上面的配置中可以看到,我们在这里进行了数据源配置,这里不仅仅配置了连接对象连接的是哪一个数据库,它的用户名和用户密码是多少,还配置了数据库连接池的初始化大小、最小和最大连接数等属性。
总结一开始,我主要说明了数据库和数据库管理系统(DBMS)的区别。虽然我们通常会将 MySQL、Oracle、PostgreSQL 等软件称为数据库,但它们实际上是一种可以操作和管理数据库的软件,而真正的数据库是指存储数据的仓库。
接着,讲了什么是数据库连接池,数据库连接池是一种池化技术,它可以提前准备好一定数量的连接对象并将它们放在一个「池子」中。这些连接对象可以被重复使用,当需要进行数据库操作时,可以从连接池中获取连接对象并执行相关操作。执行完毕后,连接对象会被放回到池子中,以供后续的操作使用。这种技术可以避免频繁地创建和销毁连接对象,从而提高应用程序的性能和效率。
最后,讲了什么是数据源以及它与连接池的关系,它们两者是不同的,或者说有这么三个词:「数据源」、「数据库连接池」、「数据源对象」。单独说数据源,那么就顾名思义,数据的来源。数据库连接池,用于管理连接的,方便连接的复用,提升效率。数据源对象,它包含了连接池的配置,也配置了数据源,即数据从哪里来。
以上,也不知道我又没有说清楚,欢迎大家评论!
最后的最后希望各位屏幕前的靓仔靓女们
给个三连!你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!
咱们下期再见!
标签:
相关阅读
-
04-22
-
04-22
-
04-21
推荐阅读
-
世界观天下!「数据库、数据库连接池、数据源」这
我学习的过程中,对于连接池和数据源分得不是很清楚,而且我发现有的人将数据库等同于数据源,或者将数据源更多
2023-04-22 01:34:56
-
环球今亮点!掌心折叠设计!vivo X Flip惊艳亮相
今晚19:00,vivo新品发布会如期而至,全能折叠旗舰vivoXFold2率先亮相,除此之外vivo还带来了vivoXFlip新机更多
2023-04-22 00:40:44
-
长绒棉是什么面料(crm是什么)
长绒棉是什么面料,crm是什么很多人还不知道,现在让我们一起来看看吧!1 CRM即客户关系管理,指的是管理企更多
2023-04-22 00:26:24
-
今日热议:XbotPark设计思维工作坊活动落幕,李泽
引言:“要学生走遍万水千山,老师自己要先走遍万水千山。要更好地支持我们的创业者,就需要我们的运营团队更多
2023-04-22 00:18:36
-
世界热点评!联合国中文日主题活动开幕
4月20日是第14个联合国中文日。中国常驻联合国代表团、联合国大会部中文翻译处、联合国中国书会在纽约联合更多
2023-04-22 00:05:59
-
宁德时代、比亚迪的钠电池年内上车,采用钠锂混装
宁德时代、比亚迪的钠电池年内上车,采用钠锂混装方案:据36氪,宁德时代将在今年第四季度开始在车上批量供更多
2023-04-21 23:24:40
-
年度个人工作总结简短范文_年度个人工作总结
1、时光如梭!转眼间我来到中国电信宽带维护部工作已经一年的时间了。2、在这一年的时间里,自己学习到了更多
2023-04-21 22:55:24
-
美股异动|AT&T跌8.6%Q1业绩、用户增长、自由现金
美股异动|AT&T跌8 6%Q1业绩、用户增长、自由现金流均逊预期:ATu0026T(T US)跌8 65%,报18美元,总市值1287更多
2023-04-21 22:39:07
时尚热图
热门标签
精彩放送
-
04-22
-
04-22
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
04-21
-
今日必看
-
精彩话题
-
今日推送
- 中信证券:预计未来信贷增长仍维持较高景气度 但增速较一季度将有所放缓
- 全球观点:虎林市气象台发布大风黄色预警【III级/较重】
- 【东海期货4月21日产业链日报】贵金属篇:初请失业金人数走高,金银震荡
- 卖假酒领刑受罚还得公开道歉 重庆市消委会公益诉讼获法院支持
- 天天热推荐:现货黄金交易策略:欧美国家PMI数据来袭,金价下行风险仍存
- 一张图:2023/04/21黄金原油外汇股指"枢纽点+多空占比"一览
- 国内超过星巴克,还要在4月反复摩擦,瑞幸杀疯了
- 天天热推荐:呈贡区重拳出击!打好大气污染防治攻坚战
- 利好袭来 工业互联网核心产业规模新突破!16只军工概念股一季度业绩预喜
- 每日点评 | 雷军突袭上海车展,哪个品牌最吸引他?
- 二元二次方程怎么解详细过程_二元二次方程怎么解_每日简讯
- 【全球新要闻】李迅雷:从淄博烧烤热再论流动创造价值
- 天天滚动:富临运业:截至2023年4月20日,公司股东人数为26,640人
- 【午报】10股涨停!医药股活跃 宁王逆势上涨|世界热消息
- 聚焦茶叶过度包装|北京东城:严查流通领域过度包装问题
- 算力基础设施计划持续落地 数字经济ETF(560800)近3日资金流入超7000万元 报道
- 国金证券:给予燕京啤酒买入评级
- 世界快资讯丨万润科技(002654)4月21日11点25分触及跌停板
- 海光信息:海光CPU在国产处理器中具有非常广泛的通用性和产业生态,可应用于边缘计算服务器中_环球热点评
- 期货公司观点汇总一张图:4月21日有色系(铜、锌、铝、镍、锡等) 热资讯
- 【全球时快讯】期货公司观点汇总一张图:4月21日农产品(棉花、豆粕、白糖、玉米、鸡蛋、生猪等)
- 全球热点!中信建投期货4月21日能源日报:欧美经济数据引发衰退担忧,关注跳空缺口附近的技术性支撑
- 长安期货4月21日原油报告:衰退担忧持续压制油价,需求支撑下前空离场
- 【环球聚看点】“铁拳”行动|市场监管总局公布2023民生领域案件查办“铁拳”行动第一批典型案例
- 奥园美谷(000615)4月21日10点28分触及跌停板
- 煌上煌:相关问题已请参见之前
- 滨海能源:尊敬公司预约的2022年年报披露日是4月21日,现已披露,请关注相关公告内容
- 牛顿内摩擦定律公式_牛顿内摩擦定律
- 国脉文化:国脉文化作为本届云生态大会主服务商,主要承担大会的会务、论坛、展览等工作
- 一心堂(002727)4月21日10点20分触及跌停板
- 上坤地产去年净亏损22.43亿元,公司股票已复牌
- 当前滚动:贝特瑞跌2.15% 报道称关联方充当"中介"获巨额利益
- 环球速讯:4月21日汇市观潮:欧元、英镑和澳元技术分析
- 天天视点!黄金市场分析:美联储5月决议前,若震荡过后保持在1970美元之上,则后市有望创新高
- 4月24日-4月28日当周重点数据和大事件前瞻-即时焦点
- 天天动态:期货公司观点汇总一张图:4月21日黑色系(螺纹钢、焦煤、焦炭、铁矿石、动力煤等)
- 中信建投期货4月21日贵金属早报:经济数据疲软,贵金属偏强运行
- 在不确定性时代,亚马逊云科技让企业拥有持续增长力
- 中国出版(601949)4月21日9点33分触及涨停板
- 刘诗诗《时装 L'OFFICIEL》五月刊封面,弥漫着春日最美好的气息
- 环球视讯!中国卫星:据公开信息,中国卫星网络集团有限公司于2021年4月组建,是由国资委监管的中央企业
- 焦点精选!【早评】市场显著分化,指数是否还有修复?
- 中新集团(601512)4月21日9点49分触及涨停板-环球新视野
- 系误会!MINI中国再致歉 “老外”是员工 每天300份冰激凌需要APP领券发放 世界今头条
- 天天热门:淮北矿业:截止2023年4月20日,公司股东户数为36165户
- 20年首次降级,中国男足76场老臣不退役,38岁狂飙14冠军+金球奖
- 【环球聚看点】*ST未来(600532)4月21日9点41分触及跌停板
- 当前速递!机构:预估4-5月硅料价格仍将续跌
- 现磨咖啡陷入价格战 平价策略能否赢市场
- 《无障碍旅游从业人员培训指南》征求意见-环球快播报