JDBC 防御性编程

防御性编程(Defensive Programming)

什么是Defensive Programming[1]

原文:Defensive programming is a form of defensive design intended to ensure the continuing function of a piece of software under unforeseen circumstances.
_
翻译:防御性编程是防御性设计的一种形式,它能够保证软件产品在不可预测的环境中持续运行。

我们可以看到,防御性编程只是防御性设计的分支,对于防御性设计,可以布满我们生活的任何角落,尤其是设计行业和制造业,因此,理解和应用防御性编程,让我们更好地懂得“防御”,也能将其应用于自己的生活。

防御性编程的重要思想[2]

所有的外部因素(输入参数、环境变量、上下文)都是“邪恶”的,都存在着企图摧毁程序的罪恶本源,为了抵制它,我们要在程序中处处检验,满地设卡,不满足条件就不再执行后续程序,以保护主程序的正确性

简单来说就是,不管别人如何使用程序,它都能做出相应的处理,因此我们需要预测可能出现的错误并阻止它。

注意,不要滥用Defensive Programming,这可能让你的程序消耗过多资源,牺牲本不必牺牲的性能(可以在文章最底部的参考资料中进一步学习)。

JDBC代码示例

防御性编程在Java异常中的应用情况

  1. 当程序产生异常,对后面的影响不大(视情况,看模块独立性),则只需抛出异常并继续执行
  2. 若程序产生异常,导致后面都不能执行,那就只能回滚重新执行,或者退出程序了

例如使用JDBC连接云端Mysql的时候,可能会断网导致无法连接,这个时候,连登录账户都不行,就需要用户

  1. 要么尝试重新连接
  2. 要么退出程序

给出示例代码,注释已经足够清楚,不再过多解释(代码是基于简单的控制台程序)

package FinancialSystem.UsualFunction;import com.mysql.cj.jdbc.exceptions.CommunicationsException;import javax.xml.crypto.Data;
import java.net.UnknownHostException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Scanner;/*** 执行连接数据库操作的类** <p>* 创建日期:2020-08-04 20:44** @author 作者* @version 1.0.0* @since 1.0.0*/public class DatabaseOperating {/*** 供其他程序连接数据库使用** <p>*     方法保证了返回值一定是非空的 Connection对象* </p>** @return Connection Object* @throws InterruptedException*/public static Connection createDatabaseLink() throws InterruptedException {Connection connection;int i = 0;for (; i < 5; i++) {connection = DatabaseOperating.createDatabase();if (connection != null) {if(i != 0){System.out.println("恭喜您,网络连接成功!");}return connection;}System.out.println("是否尝试重新连接?");System.out.println("1. 是   2. 否");Scanner scanner = new Scanner(System.in);System.out.print("请输入序号:");int choose = scanner.nextInt();if(choose != 1){break;}}if (i == 5) {System.err.println("超过重连次数,请联系相关运营商检查您的网络!");}for (int j = 5; j > 0; j--) {System.err.print("\r" + j + "秒后将自动退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);return null;}/*** 连接本地(或云端)的Mysql数据库** @return Connection实例*/private static Connection createDatabase() throws InterruptedException {try {String url = "jdbc:mysql://主机:端口/数据库";String user = "用户名";String password = "密码";return DriverManager.getConnection(url, user, password);} catch (CommunicationsException communicationsException) {System.err.println("网络连接错误!");return null;} catch (SQLException throwable) {// throwable.printStackTrace();System.err.println("远程服务器连接失败");for (int i = 5; i > 0; i--) {System.err.print("\r" + i + "秒后将自动退出程序");Thread.sleep(1000);}System.err.print("\r程序退出!");System.exit(0);}return null;}
}

方法的调用,能够保证,connection一定不是null,也就能够保证后面的一些步骤避免一些问题,例如NullPointerException

举例如下(部分代码):

String sql = "sql语句";try (Connection connection = DatabaseOperating.createDatabaseLink();PreparedStatement preparedStatement = connection.prepareStatement(sql)
) {// <代码部分>
} catch (SQLException | InterruptedException throwable) {throwable.printStackTrace();
}

思考点

以下是我的思考,对于初学者,我想暂时我暂时没有必要花精力于此处,目前这些也没有搜集专业资料,仅供思考,这一小节可以忽略掉

  1. JDBC不应该使用一个具备大量的MySQL账户,这是危险的,我们应该分配多个具备专门权限的账户,去处理不同的信息。
  2. 不应该使用明码表示MySQL账户,如果那样的话,使用逆向工程,很容易被找到和破解,这样不太安全,例如,可以将账户存在隐秘的地方以密码传输,在程序中解码;又或者使用低等权限账户登录数据库,从数据库获取具备操作权限的账户信息,再用该账户登录数据库。

参考资料

[1] Wikipedia: Defensive Programming

[2] 防御性编程的核心思想

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

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

相关文章

【Java】异常处理的目的

编程思维&#xff1a;Defensive Programming 我们写好程序&#xff0c;将其打包&#xff0c;然后用户就可以使用和运行&#xff0c;但是&#xff0c;外界的情况是未知的&#xff0c;我们的程序很可能因为某个因素的出现而崩溃&#xff0c;因此&#xff0c;对于我们可以预测到的…

【Coursera】Getting Started with Python:Week One - Reading: Welcome to The Class

原文 & 翻译 Reading: Welcome to The Class Welcome to Getting Started with Python, the first class in our Python for Everybody Specialization. We have built this class specifically for those with no prior programming experience. With a relatively simpl…

【Java】获取目录及其子目录文件的相关事宜

获取目录及其子目录文件的代码 public class Main {public static void main(String[] args) {String path "D:/"; File f new File(path);Main.getFile(f);}public static void getFile(File file){if(file ! null){File[] f file.listFiles();if(f ! null){for…

【计算机思维】面向人的开发 站在巨人的肩膀上

思维转变&#xff1a;使用其他程序员开发的“黑箱”&#xff0c;不要重复造轮子 以Java举例&#xff0c;从常用的集合框架开始&#xff0c;我们要产生新的思维转变了&#xff0c;我们已经学会了基本的功能&#xff0c;但是在真正开发的时候&#xff0c;用基础功能去做开发效率…

【Computer Organization】The Core Design Thinking of single cycle CPU

1 Overview This section introduces someting that maybe you need to know before learning. Note:This CPU is based on MIPS instruction set. 1.1 Tools LogisimCS 3410 ComponentsMARS MIPS simulatorWin10 or Mac OS 1.2 Courses 自己动手画CPU《计算机组织与结构实…

【汇编语言】王爽 - 内中断复习

0 前言 基于王爽《汇编语言》和Coursera的《计算机组成》课程。 1 中断分类 CPU在执行指令的过程中&#xff0c;产生了一个异常/中断&#xff0c;因为CPU只能同时执行一条指令&#xff0c;所以需要暂停该指令的执行&#xff0c;转而去处理异常/中断信息。 这个异常可以来…

【算法】蛮力法/穷举法/枚举法 的基本问题分析

炮兵问题的优化&#xff0c;设立逻辑数组 蛮力法设计思想 有策略地穷举 验证 制定穷举策略避免重复 简单来说&#xff0c;就是列举问题所有可能的解&#xff0c;然后去看看是否满足题目要求&#xff0c;是一种逆向解题方式。&#xff08;我也不知道答案是什么&#xff0c;…

如何高效学习算法【实例 + 可视化】

对于初学者来说&#xff0c;学习算法&#xff0c;不应该先学习抽象的理论&#xff0c;那样没有感觉&#xff0c;越学越晕&#xff0c;应该&#xff1a; 有具体的例子有可视化过程 同时需要结合理论知识对照学习&#xff0c;理论扎实、实践有效&#xff0c;同时要有结果反馈。…

【计算机网络实验·北航】实验一:网络实验入门(1)

1.3 远程在线环境使用 PCA、PCB、PCC和PCD&#xff1a;4台PC机S1、S2&#xff1a;2台交换机R1、R2&#xff1a;2台路由器中间的设备&#xff1a;组网连线器 远程组网连线&#xff1a; 使用PCA上的组网连线软件&#xff0c;配置组网连线器&#xff0c;实现组网连线。 PCA和PCB…

【C++】int与string转换

头文件&#xff1a;<string>&#xff0c;注意&#xff0c;这与<string.h>、<cstring>不是一回事儿语法&#xff1a;int x to_string(str)&#xff0c;其中string str "1"。

【C++】rand函数的基本使用

rand()函数用于生成伪随机数&#xff0c;每次生成的随机数都不变&#xff0c;方便我们调试程序。 重要是的随机数的范围公式&#xff08;适用整数&#xff09; 公式&#xff1a; 确定范围加偏移量 例如&#xff1a;a和b是整数 [a,b]&#xff0c;范围是b - a 1&#xff0c…

【操作系统】虚拟化CPU、Memory,共享文件

几个概念 CPU、虚拟CPU进程内存、虚拟地址空间 物理的CPU被OS虚拟成了多个虚拟的CPU&#xff0c;这些虚拟CPU分别运行各自的程序&#xff0c;这些正在运行的程序被称为进程。物理内存被OS虚拟成了多个虚拟地址空间&#xff0c;每个进程都有独立的、自己的地址空间&#xff0c;…

【Linux】编译C语言文件(-o -lpthread)

在gcc中使用-o编译 对于一个一般的程序&#xff0c;直接使用gcc <C语言文件名> -o <编译后生成的文件名>即可&#xff0c;例如以下程序&#xff1a; // cpu.c #include <stdio.h> #include <unistd.h> #include <stdlib.h>int main(int argc,…

【Linux】Ubuntu下进行C语言编程

前言 需要您会使用Windows下cd切换目录的基本命令&#xff0c;否则请先自学相关知识&#xff0c;之后再阅读本文。 0 基础命令 介绍最基础的Linux终端命令。 su - root&#xff1a;切换到root用户&#xff08;不用也可以&#xff09;ls&#xff1a;查看当前目录位置cd&…

【Linux】Ubuntu 18下安装Vim自动补全插件YouCompleteMe(可高速下载安装)

前言 本文写于2020年10月&#xff0c;如果你多年后看见这篇文章&#xff0c;方法可能已经失效&#xff0c;但是请牢记&#xff0c;尽量下载你所处时代的最新版本的软件&#xff0c;会减少很多麻烦。 摆正心态 即便按照本文操作&#xff0c;由于你的系统状态和我的不一样&…

【操作系统】进程调度(1):FIFO(先进先出)算法 原理与实践

0 前言 本文基于书籍《Operating System&#xff1a;Three Easy Pieces》。 中译本&#xff1a;《操作系统导论》&#xff0c;中译本质量还可以&#xff0c;但是英文版后来的更新&#xff0c;中文版目前没有进行同步更新&#xff08;写下此文的时间是2020年10月&#xff09; 1…

【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;1&#xff09;&#xff1a;FIFO&#xff08;先进先出&#xff09;算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分&#xff0c;本文与之完全一致。 2 SJF 原理 SJF&#xff08;Shortest Job First&#x…

【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2a&#xff09;&#xff1a;SJF&#xff08;短任务优先&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 STCF 原理 STCF&#xff08;Shortest Time-to-Completion First&#xff09;最短完成时间优先。 2.1…

【操作系统】进程调度(3):RR(轮转) 算法 原理与实践

0 前言 接上一篇文章&#xff1a;进程调度&#xff08;2b&#xff09;&#xff1a;STCF&#xff08;最短完成时间优先&#xff09; 算法 原理与实践 1 前提铺垫 除了与上一篇相同的&#xff0c;这里介绍新的基础知识。 1.1 三种类型的程序 计算密集型&#xff08;CPU导向&…

【操作系统】进程调度(4):I/O、不可预测的运行时间

0 前言 上一篇文章&#xff1a;进程调度&#xff08;3&#xff09;&#xff1a;RR&#xff08;轮转&#xff09; 算法 原理与实践 1 前提铺垫 与上一篇同。 2 引入I/O操作 之前我们一直提及的是计算密集型程序&#xff0c;现在我们的程序可以进行I/O交互了&#xff0c;它会…