【JDBC】数据库连接的艺术:深入解析数据库连接池、Apache-DBUtils与BasicDAO

news2025/2/22 13:30:47

在这里插入图片描述

文章目录

    • 前言
    • 🌍 一.连接池
      • ❄️1. 传统获取Conntion问题分析
      • ❄️2. 数据库连接池
      • ❄️3.连接池之C3P0技术
        • 🍁3.1关键特性
        • 🍁3.2配置选项
        • 🍁3.3使用示例
      • ❄️4. 连接池之Druid技术
        • 🍁 4.1主要特性
        • 🍁 4.2 配置选项
        • 🍁 4.3 使用示例
    • 🌍 二.Apache-DBUtil
        • ❄️1. 关键特性
        • ❄️2. 主要类和方法
        • ❄️3. 使用示例
    • 🌍 三.BasicDAO
      • ❄️1. 引入
      • ❄️2. `BasicDAO` 类通常包含以下功能:
      • ❄️3. 以下是如何使用 `BasicDAO` 的示例:


🙋‍♂️ 作者:@whisperrr.🙋‍♂️

👀 专栏:JDBC 👀

🎉 其他专栏:零基础学Mysql 🎉

💥 标题:探索JDBC:Java数据库连接的艺术与魅力💥

❣️ 寄语:比较是偷走幸福的小偷❣️

前言

在当今信息时代的浪潮中,数据库作为信息存储和处理的核心,其重要性不言而喻。作为一名普通的软件开发者,我在数据库连接与操作的道路上摸索前行,积累了一些实践经验。在此,与大家分享关于数据库连接池、Apache-DBUtils和BasicDAO这三个技术的一些心得和体会。本文旨在抛砖引玉,希望能够为同行们在优化数据库操作、提高系统性能的征途上提供一点参考和帮助。让我们一起学习,共同进步。

🌍 一.连接池

在学习一个新技术的时候,我们先来看看传统的方式有哪些问题,新技术又能解决什么样的问题,通过什么方式解决问题.

❄️1. 传统获取Conntion问题分析

  1. 传统的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将 Connection 加载的内存中,再验证 IP 地址,用户名和密码,频繁的进行数据库的连接将要占用很多的系统资源,任意造成服务器崩溃.
  2. 每一次数据库连接,都要及时断开,如果程序出现异常而未能及时关闭,将导致数据库内存泄漏,最终将导致重启数据库
  3. 传统的获取连接的方式,不能控制连接的数量,如果连接过多,也可能导致数据库的内存泄漏

感情的自然流露,我们引出数据库连接池。

❄️2. 数据库连接池

数据库连接池(Database Connection Pool)是一种用于提高数据库操作性能和资源管理效率的技术。可以很好的解决上面的传统方式带来的问题.

2.1 数据库连接池的基本原理如下:

  1. 初始化: 在系统启动时,创建一定数量的数据库连接,并将这些连接放入连接池中。
  2. 使用: 当用户请求一个数据库连接时,连接池会提供一个空闲的连接。如果连接池中没有空闲连接,则会根据最大连接数限制决定是否创建新的连接。
  3. 释放: 当用户完成数据库操作后,不会直接关闭数据库连接,而是将连接返回给连接池,以便其他请求复用。
  4. 管理: 连接池负责维护连接的状态,如定期检查连接的有效性,根据需要创建或销毁连接,保证连接池中的连接数量在一个合理的范围内。

2.2 数据库连接池的优点包括:

  • 提高性能: 通过复用连接减少建立和关闭连接的次数,显著提高系统性能。
  • 资源利用: 有效管理数据库连接,避免连接泄漏,节省系统资源。
  • 响应速度: 减少等待建立连接的时间,提高系统的响应速度。
  • 可配置性: 可以根据系统负载动态调整连接池的大小,适应不同的应用场景。

2.3 数据库连接池的技术包括:JDBC的数据库连接池使用javax.sql.DataSource来表示,DataSource只是一个接口,该接口通常由第三方提供实现[提供.jar]

  • C3PO数据库连接池,速度相对较慢,稳定性不错(hibernate,spring)
  • DBCP数据库连接池,速度相对c3p0较快,但不稳定
  • Proxool数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点
  • BoneCP数据库连接池,速度快
  • Druid(德鲁伊)是阿里提供的数据库连接池,集DBCP、C3PO、Proxool优点于一身的数据库连接池

❄️3.连接池之C3P0技术

c3p0 是一个 Java 编程语言中的数据库连接池库,它实现了数据源和 JNDI 适配器,用于提高数据库操作的效率和性能。c3p0 旨在提供一个高效、可靠的解决方案,用于管理数据库连接,减少创建和销毁连接的开销。
以下是 c3p0 的一些关键特性和配置选项:

🍁3.1关键特性
  1. 自动连接池管理: c3p0 能够自动管理数据库连接池,无需手动干预。
  2. 配置灵活: 提供了丰富的配置选项,可以通过 XML 文件、属性文件或直接在代码中进行配置。
  3. 支持多种数据库: c3p0 支持多种关系型数据库,如 MySQL、PostgreSQL、Oracle、SQL Server 等。
  4. 数据源和 JNDI 支持: c3p0 可以配置为数据源,并且可以与 JNDI 一起使用,便于在应用服务器环境中集成。
  5. 扩展性: c3p0 设计上考虑了扩展性,允许开发者根据需要定制连接池的行为。
🍁3.2配置选项

以下是一些常用的 c3p0 配置参数:

  • initialPoolSize: 初始化时创建的连接数。
  • maxPoolSize: 连接池中保留的最大连接数。
  • minPoolSize: 连接池中保留的最小连接数。
  • maxIdleTime: 连接的最大空闲时间,超过这个时间未使用的连接将被关闭。
  • acquireIncrement: 当连接池中的连接耗尽时,一次性创建的连接数。
  • idleConnectionTestPeriod: 空闲连接测试周期,用于验证空闲连接是否仍然有效。
  • checkoutTimeout: 当没有可用连接时,从连接池中获取连接的最大等待时间。
  • maxStatements: 缓存的最大 SQL 语句数。
  • maxStatementsPerConnection: 每个连接可以缓存的最大 SQL 语句数。
🍁3.3使用示例

以下是一个简单的 c3p0 配置和使用示例:

import com.mchange.v2.c3p0.ComboPooledDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class C3P0Example {
    private static DataSource dataSource;
    static {
        ComboPooledDataSource cpds = new ComboPooledDataSource();
        cpds.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
        cpds.setUser("username");
        cpds.setPassword("password");
        cpds.setInitialPoolSize(5);
        cpds.setMaxPoolSize(20);
        // 其他配置...
        dataSource = cpds;
    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    public static void main(String[] args) {
        try (Connection conn = getConnection()) {
            // 使用连接进行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在使用 c3p0 时,建议仔细阅读官方文档,并根据实际应用场景调整配置参数,以达到最佳性能。随着技术的发展,新的连接池技术(如 HikariCP)提供了更好的性能和更简单的配置,因此在选择连接池时,可以考虑比较不同库的性能和特性。

❄️4. 连接池之Druid技术

Druid 是一个用于数据库连接池和SQL监控的Java开源库,由阿里巴巴开源。它不仅提供了数据库连接池的功能,还包含了许多其他特性,如数据库加密、SQL执行日志、PSCache、慢SQL记录、SQL注入攻击防护等。Druid 广泛应用于各种需要数据库操作的Java应用程序中,特别是在大数据和高并发的场景下。
以下是 Druid 的一些主要特性和优势:

🍁 4.1主要特性
  1. 强大的连接池管理: Druid 提供了高效的连接池管理,支持多种数据库,并且能够处理大量并发连接。
  2. 监控功能: Druid 能够监控数据库访问性能,包括执行时间、并发数、慢查询等,有助于优化数据库性能。
  3. SQL防火墙: Druid 可以防止SQL注入攻击,确保数据库的安全性。
  4. 数据库加密: 支持对数据库密码进行加密,提高安全性。
  5. 多种配置方式: Druid 支持多种配置方式,包括XML、properties文件、编程方式等。
  6. 扩展性: Druid 设计灵活,可以通过编写插件来扩展其功能。
🍁 4.2 配置选项

Druid 的配置选项非常丰富,以下是一些常用的配置参数:

  • initialSize: 初始化时建立物理连接的个数。
  • minIdle: 最小连接池数量。
  • maxActive 最大连接池数量。
  • maxWait: 获取连接时最大等待时间,单位毫秒。
  • timeBetweenEvictionRunsMillis 间隔多久进行一次检测,检测需要关闭的空闲连接。
  • minEvictableIdleTimeMillis: 连接在池中最小生存的时间。
  • validationQuery: 用来检测连接是否有效的SQL语句。
  • testWhileIdle: 建议配置为true,不影响性能,并且保证安全性。
  • estOnBorrow: 申请连接时执行validationQuery检测连接是否有效。
  • testOnReturn: 归还连接时执行validationQuery检测连接是否有效。
🍁 4.3 使用示例

以下是一个简单的 Druid 配置和使用示例:

import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class DruidExample {
    private static DataSource dataSource;
    static {
        DruidDataSource dds = new DruidDataSource();
        dds.setUrl("jdbc:mysql://localhost:3306/mydb");
        dds.setUsername("username");
        dds.setPassword("password");
        dds.setInitialSize(5);
        dds.setMinIdle(5);
        dds.setMaxActive(20);
        // 其他配置...
        dataSource = dds;
    }
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
    public static void main(String[] args) {
        try (Connection conn = getConnection()) {
            // 使用连接进行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在使用 Druid 时,可以通过其提供的监控界面来查看数据库连接池的状态、SQL执行情况等,这对于诊断和优化数据库性能非常有帮助。Druid 的监控功能是其一大亮点,使得它在众多数据库连接池技术中脱颖而出。

🌍 二.Apache-DBUtil

Apache DBUtils 是 Apache 软件基金会下的一个开源 Java 库,它提供了一套简单的 JDBC helper 类,用于简化数据库操作。DBUtils 主要包含两个核心类:QueryRunnerResultSetHandler。这些类可以帮助开发者执行 SQL 查询和更新,并且处理查询结果,而无需编写大量的样板代码。

为什么学习这个技术:
1.关闭connection后,resultSet结果集无法使用
2.resultSet不利于数据的管理
3.示意图

在这里插入图片描述

以下是 Apache DBUtils 的一些关键特性和用法:

❄️1. 关键特性
  1. 简化 JDBC 操作: DBUtils 封装了 JDBC 的基本操作,使得数据库操作更加简洁。
  2. 结果集处理: 提供了多种 ResultSetHandler 实现来处理查询结果,例如将结果集转换为对象列表、单个对象、数组等。
  3. 批处理支持: 支持批处理操作,可以一次性执行多个 SQL 语句。
  4. 异常处理: 提供了异常转换功能,将 SQLException 转换为未经检查的异常(如 java.lang.RuntimeException 的子类),简化异常处理。
❄️2. 主要类和方法
  • QueryRunner: 用于执行 SQL 查询和更新操作。
    • query(String sql, ResultSetHandler rsh, Object... params):执行查询操作。
    • update(String sql, Object... params):执行更新操作(INSERT、UPDATE、DELETE)。
  • ResultSetHandler: 接口,用于处理 ResultSet 对象。
    • ArrayHandler:将结果集的第一行数据转换为对象数组。
    • BeanHandler:将结果集的第一行数据转换为指定的 JavaBean 对象。
    • BeanListHandler:将结果集的所有行转换为指定 JavaBean 对象的列表。
    • ScalarHandler:用于处理单个值的结果,例如 COUNT、MAX、MIN 等。
❄️3. 使用示例

以下是一个使用 Apache DBUtils 的简单示例:

import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
public class DBUtilsExample {
    public static void main(String[] args) {
        QueryRunner runner = new QueryRunner();
        Connection conn = null;
        try {
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
            List<User> users = runner.query(conn, "SELECT * FROM users", new BeanListHandler<>(User.class));
            users.forEach(user -> System.out.println(user.getUsername()));
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
class User {
    private int id;
    private String username;
    // getters and setters
}

在这个例子中,我们使用 QueryRunner 来执行一个查询,并将结果集转换为 User 对象的列表。我们使用了 BeanListHandler 来处理结果集。
Apache DBUtils 是一个轻量级的库,非常适合于简单的数据库操作,特别是当你不想引入更复杂的 ORM 框架时。然而,对于更复杂的数据库操作和业务逻辑,可能需要考虑使用更全面的 ORM 框架,如 Hibernate 或 MyBatis。

🌍 三.BasicDAO

❄️1. 引入

apache-dbutils+Druid简化了JDBC开发,但还有不足:
1.SQL语句是固定,不能通过参数传入,通用性不好,需要进行改进,更方便执行增删改查
2.对于select操作,如果有返回值,返回类型不能固定,需要使用泛型
3.将来的表很多,业务需求复杂,不可能只靠一个Java类完成
4.引出=》BasicDAO画出示意图,看看在实际开发中,应该如何处理
在这里插入图片描述在这里插入图片描述

BasicDAO 是一个通用的数据访问对象(DAO)抽象层的实现,它通常用于简化数据库操作。在Java中,DAO层的主要目的是将数据库操作代码与业务逻辑代码分离,使得业务逻辑更加清晰,同时也便于数据库迁移和维护。

❄️2. BasicDAO 类通常包含以下功能:

  1. 连接管理: 管理数据库连接的创建和关闭。
  2. CRUD操作: 提供创建(Create)、读取(Read)、更新(Update)和删除(Delete)操作的通用实现。
  3. 查询执行: 执行各种SQL查询,并处理结果集。
  4. 事务管理: 管理事务的开始、提交和回滚。
    以下是一个简单的 BasicDAO 类的示例实现,它使用了 Apache Commons DBUtils 来简化操作:
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
public abstract class BasicDAO<T> {
    private QueryRunner queryRunner = new QueryRunner();
    private Class<T> type;
    public BasicDAO(Class<T> type) {
        this.type = type;
    }
    protected Connection getConnection() throws SQLException {
        // 这里应该根据实际情况来获取数据库连接
        // 例如,从数据源(DataSource)获取连接
        return DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "username", "password");
    }
    public T queryForObject(String sql, Object... params) throws SQLException {
        try (Connection conn = getConnection()) {
            return queryRunner.query(conn, sql, new BeanHandler<>(type), params);
        }
    }
    public List<T> queryForList(String sql, Object... params) throws SQLException {
        try (Connection conn = getConnection()) {
            return queryRunner.query(conn, sql, new BeanListHandler<>(type), params);
        }
    }
    public <V> V queryForScalar(String sql, Object... params) throws SQLException {
        try (Connection conn = getConnection()) {
            return queryRunner.query(conn, sql, new ScalarHandler<V>(), params);
        }
    }
    public int update(String sql, Object... params) throws SQLException {
        try (Connection conn = getConnection()) {
            return queryRunner.update(conn, sql, params);
        }
    }
}

在这个 BasicDAO 类中,我们定义了几个方法来执行常见的数据库操作。这个类是泛型的,可以用于任何类型的实体类。使用时,你需要为你的实体类创建一个继承自 BasicDAO 的具体实现。

❄️3. 以下是如何使用 BasicDAO 的示例:

public class UserDao extends BasicDAO<User> {
    public UserDao() {
        super(User.class);
    }
    // 这里可以添加特定于User的数据库操作方法
}
// 使用UserDao
UserDao userDao = new UserDao();
User user = userDao.queryForObject("SELECT * FROM users WHERE id = ?", 1);
List<User> users = userDao.queryForList("SELECT * FROM users");
int updatedRows = userDao.update("UPDATE users SET username = ? WHERE id = ?", "newUsername", 1);

在这个例子中,UserDao 继承自 BasicDAO 并指定了实体类 User。然后,你可以使用 UserDao 来执行针对 User 表的数据库操作。
请注意,这个 BasicDAO 示例是一个简化版本,实际应用中可能需要更多的功能和错误处理。此外,直接使用 JDBC 和 DBUtils 可能不是最佳实践,特别是在大型或复杂的项目中,通常会使用更高级的框架如 Hibernate、MyBatis 或 Spring Data JPA 来处理数据访问层。

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

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

相关文章

canvas 图片组合并进行下载

运行图片&#xff1a; 思路&#xff1a;先画一个背景图片&#xff0c;再画一个二维码定位到你想要的位置&#xff0c;最后直接下载即可&#xff0c;可以扩散一下思维&#xff0c;画简单的海报的时候&#xff0c;也可以的 源代码 <!DOCTYPE html> <html lang"en&q…

记一次升级请求创建报错问题的调查过程(Windchill)

问题现象描述&#xff1a; ​ 新建申请请求单&#xff0c;在选择某些物料时会报此错误&#xff0c;选另外的物料时又可以正常创建&#xff0c;不报此错误。 问题原因分析&#xff1a; ​ 1.分析后台日志 —没有任何进展&#xff0c;此报错应该是前端的报错 ​ 2.从前端下手…

自旋锁与CAS

上文我们认识了许许多多的锁&#xff0c;此篇我们的CAS就是从上文的锁策略开展的新概念&#xff0c;我们来一探究竟吧 1. 什么是CAS&#xff1f; CAS: 全称Compare and swap&#xff0c;字⾯意思:“比较并交换”&#xff0c;⼀个CAS涉及到以下操作&#xff1a; 我们假设内存中…

线程池遇到未处理的异常会崩溃吗?

线程池中的 execute 和 submit 方法详解 目录 引言execute 方法 使用示例代码 submit 方法 2.1 提交 Callable 任务2.2 提交 Runnable 任务 遇到未处理异常 3.1 execute 方法遇到未处理异常3.2 submit 方法遇到未处理异常 小结 引言 在多线程编程中&#xff0c;线程池是提高性…

2024年第十五届蓝桥杯青少组国赛(c++)真题—快速分解质因数

快速分解质因数 完整题目和在线测评可点击下方链接前往&#xff1a; 快速分解质因数_C_少儿编程题库学习中心-嗨信奥https://www.hixinao.com/tiku/cpp/show-3781.htmlhttps://www.hixinao.com/tiku/cpp/show-3781.html 若如其他赛事真题可自行前往题库中心查找&#xff0c;题…

Linux内核编程(二十一)USB驱动开发

一、驱动类型 USB 驱动开发主要分为两种&#xff1a;主机侧的驱动程序和设备侧的驱动程序。一般我们编写的都是主机侧的USB驱动程序。 主机侧驱动程序用于控制插入到主机中的 USB 设备&#xff0c;而设备侧驱动程序则负责控制 USB 设备如何与主机通信。由于设备侧驱动程序通常与…

AI Agent:深度解析与未来展望

一、AI Agent的前世&#xff1a;从概念到萌芽 &#xff08;一&#xff09;早期探索 AI Agent的概念可以追溯到20世纪50年代&#xff0c;早期的AI研究主要集中在简单的规则系统上&#xff0c;这些系统的行为是确定性的&#xff0c;输出由输入决定。随着时间的推移&#xff0c;…

SuperMap iClient3D for WebGL选中抬升特效

在大屏展示系统中&#xff0c;对行政区划数据制作了立体效果&#xff0c;如果希望选中某一行政区划进行重点介绍&#xff0c;目前常见的方式是通过修改选中对象色彩、边线等方式进行实现&#xff1b;这里提供另外一种偏移动效的思路&#xff0c;并提供下钻功能&#xff0c;让地…

领域算法 - 字符串匹配算法

字符串匹配算法 文章目录 字符串匹配算法一&#xff1a;KMP算法1&#xff1a;算法概述2&#xff1a;部分匹配表3&#xff1a;算法实现 二&#xff1a;Moore算法1&#xff1a;算法概述2&#xff1a;代码实现3&#xff1a;完整实现 三&#xff1a;马拉车算法1&#xff1a;算法概述…

小红书用户作品列表 API 系列,返回值说明

item_search_shop_video-获得某书用户作品列表 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_sea…

LeetCode hot 力扣热题100 排序链表

归并忘了 直接抄&#xff01; class Solution { // 定义一个 Solution 类&#xff0c;包含链表排序的相关方法。// 使用快慢指针找到链表的中间节点&#xff0c;并断开链表为两部分ListNode* middleNode(ListNode* head) { ListNode* slow head; // 慢指针 slow 初始化为链表…

JavaScript正则表达式解析:模式、方法与实战案例

目录 一、什么是正则表达式 1.创建正则表达式 2.标志&#xff08;Flags&#xff09; 3.基本模式 &#xff08;1&#xff09;字符匹配 &#xff08;2&#xff09;位置匹配 &#xff08;3&#xff09;数量匹配 二、常用的正则表达式方法和属性 1.test()‌ 2.match()‌ …

Nginx在Linux中的最小化安装方式

1. 安装依赖 需要安装的东西&#xff1a; wget​&#xff0c;方便我们下载Nginx的包。如果是在Windows下载&#xff0c;然后使用SFTP上传到服务器中&#xff0c;那么可以不安装这个软件包。gcc g​&#xff0c;Nginx是使用C/C开发的服务器&#xff0c;等一下安装会用到其中的…

【大模型】ChatGPT 高效处理图片技巧使用详解

目录 一、前言 二、ChatGPT 4 图片处理介绍 2.1 ChatGPT 4 图片处理概述 2.1.1 图像识别与分类 2.1.2 图像搜索 2.1.3 图像生成 2.1.4 多模态理解 2.1.5 细粒度图像识别 2.1.6 生成式图像任务处理 2.1.7 图像与文本互动 2.2 ChatGPT 4 图片处理应用场景 三、文生图操…

基于python+Django+mysql鲜花水果销售商城网站系统设计与实现

博主介绍&#xff1a;黄菊华老师《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者&#xff0c;CSDN博客专家&#xff0c;在线教育专家&#xff0c;CSDN钻石讲师&#xff1b;专注大学生毕业设计教育、辅导。 所有项目都配有从入门到精通的基础知识视频课程&#xff…

-bash: /java: cannot execute binary file

在linux安装jdk报错 -bash: /java: cannot execute binary file 原因是jdk安装包和linux的不一致 程序员的面试宝典&#xff0c;一个免费的刷题平台

免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)

哈喽大家好&#xff0c;欢迎来到虚拟化时代君&#xff08;XNHCYL&#xff09;&#xff0c;收不到通知请将我点击星标&#xff01;“ 大家好&#xff0c;我是虚拟化时代君&#xff0c;一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…

面试--你的数据库中密码是如何存储的?

文章目录 三种分类使用 MD5 加密存储加盐存储Base64 编码:常见的对称加密算法常见的非对称加密算法https 传输加密 在开发中需要存储用户的密码&#xff0c;这个密码一定是加密存储的&#xff0c;如果是明文存储那么如果数据库被攻击了&#xff0c;密码就泄露了。 我们要对数据…

模型部署工具01:Docker || 用Docker打包模型 Build Once Run Anywhere

Docker 是一个开源的容器化平台&#xff0c;可以让开发者和运维人员轻松构建、发布和运行应用程序。Docker 的核心概念是通过容器技术隔离应用及其依赖项&#xff0c;使得软件在不同的环境中运行时具有一致性。无论是开发环境、测试环境&#xff0c;还是生产环境&#xff0c;Do…

Restormer: Efficient Transformer for High-Resolution Image Restoration解读

论文地址&#xff1a;Restormer: Efficient Transformer for High-Resolution Image Restoration。 摘要 由于卷积神经网络&#xff08;CNN&#xff09;在从大规模数据中学习可推广的图像先验方面表现出色&#xff0c;这些模型已被广泛应用于图像复原及相关任务。近年来&…