Java研学-druid连接池

一 连接池

1 概述

  JDBC 数据库连接(Connectiond对象)使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码得花费 0.05s~1s 的时间,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。
  数据库连接对象不能够重复利用.若同时有几百人频繁的进行数据库连接操作将占用很多的系统资源,对于每一次数据库连接,使用完后都得断开,不能控制被创建的连接对象数,系统资源会被无限制的分配出去,可导致内存泄漏,服务器崩溃
  此时可以通过预先创建好Connection 对象,存起来重复使用,存了 Connection 的容器就是连接池

2 连接池属性

① 基本属性:连接池中连接对象所依赖的四要素
  driverClassName , url , username , password
② 其他属性:限制连接对象的配置
  初始化连接数:5 在连接池中事先准备好5个Connection对象
  最多连接数:10 在连接池中最多有10个Connection对象,其他客户端进入等待状态
  最少连接数 : 3 在连接池中最少存在3个Connection对象
  最长等待时间:5 min 使用5分钟来申请获取 Connection 对象,如果时间到还没有申请到,则提示,自动放弃
  最长超时时间:10min 在10分钟之内没有任何动作,即是自动放弃 Connection 对象。连接池使用 javax.sql.DataSource 接口来表示连接池. DataSource(数据源)和连接池(Connection Pool)是同一个

3 使用连接对象与使用连接池的区别

① 获取 Connection 对象
  连接对象: Connection conn=DriverManager.getConnection(url,username,password);
  连接池:Connection conn = DataSource对象.getConnection();
  获取Connection对象后二者操作是一样的
② 释放 Connection对象(Connection对象.close()):
  连接对象: 与数据库服务器断开
  连接池: 将Connection对象返还给连接池中,数据库服务器没有断开连接

二 druid 连接池

1 介绍

  druid:是阿里巴巴研发出来的号称 Java语言领域性能最高的连接池
  安装包下载地址

2 演示

// 演示基本代码
@Test
public void testDruidDataSource() throws Exception {
// 创建一个连接池对象DruidDataSource ds = new DruidDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/jdbcdemo");ds.setUsername("root");ds.setPassword("admin");ds.setInitialSize(5);//初始化创建连接的个数Connection conn = ds.getConnection();System.out.println(conn.getClass());
}

创建连接池对象时,可将连接数据库信息编写到 Properties 配置文件中,然后再读取到内存中来使用

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///jdbcdemo
jdbc.user=root
jdbc.password=root

工具类

public class DruidUtil {private static DataSource dataSource=null;static {try {Properties properties=new Properties();properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("druid.properties"));dataSource = DruidDataSourceFactory.createDataSource(properties);//通过此语句进行赋值操作} catch (Exception e) {e.printStackTrace();}}/*获取连接对象:通过数据源对象创建连接对象*/public static Connection getConnection(){try {return dataSource.getConnection();} catch (SQLException e) {e.printStackTrace();}return null;}
}

测试类

public class DruidTest {public static void main(String[] args) throws SQLException {Connection connection = DruidUtil.getConnection();//创建连接对象Statement statement = connection.createStatement();String sql="SELECT * from t_employee";ResultSet resultSet = statement.executeQuery(sql);while (resultSet.next()){System.out.println(resultSet.getString("ename"));}}
}

数据库表

CREATE TABLE `t_employee` (`id` bigint(20) NOT NULL AUTO_INCREMENT,`eid` varchar(10) NOT NULL,`ename` varchar(6) NOT NULL,`job` varchar(10) DEFAULT NULL,`salary` int(10) DEFAULT NULL,`password` varchar(20) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `eid` (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {private Long id;private String eid;private String ename;private String password;private String job;private Integer salary;
}

三 sql注入

1 介绍

  SQL注入是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。QL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句中,若在数据项中加入了某些SQL语句关键字(如SELECT、DROP等),这些关键字有可能在数据库写入或读取数据时得到执行。

2 常见的十种注入方式

① 可显注入
  攻击者可以直接在当前界面内容中获取想要获得的内容。

② 报错注入:
  数据库查询返回结果并没有在页面中显示,但是应用程序将数据库报错信息打印到了页面中,所以攻击者可以构造数据库报错语句,从报错信息中获取想要获得的内容。

③ 盲注:
  数据库查询结果无法从直观页面中获取,攻击者通过使用数据库逻辑或使数据库库执行延时等方法获取想要获得的内容。

④ 时间盲注:
  常用函数 sleep ()
  分割函数 substr、substring、left
  分割函数编码后可不用引号,ascii () hex ()
  一般时间盲注我们还需要使用条件判断函数
  if(expre1,expre2,expre3)
  当 expre1 为 true 时,返回 expre2,false 时,返回 expre3

⑤ 布尔盲注::
  这种注入会出现在 注册、ip 头、留言板等需要写入数据的地方,如用 sqlmap 会产生大量垃圾数据。尝试性插入、引号、双引号、转义符 \ 让语句不能正常执行,若插入失败,更新失败,再深入测试确定是否存在注入。

⑥ 二次注入:
  sql 语句的变量并不是直接传入的变量,而是通过其它的方式保存到了数据库,形成二次注入。没有单引号的 sql 语句中,进行 16 进制编码,这样就不会带有单引号。

⑦ 宽字节注入:
  一个字符的大小是一个字节的,称为窄字节;如果一个字符的大小是两个字节的,称为宽字节
  字符注入时需要逃逸单引号,但 php 提供了魔术引号开关 magic_quotes_gpc 和 addslashes (),iconv () 函数作为防御,特点是自动给传入的参数如单引号,双引号,反斜杠,%00 前面加一个反斜杠,进行转义,避免单引号进行逃逸。
  单引号转义为 ‘ , mysql 会将 \ 编码为 %5c ,宽字节中将 % df 加上 %5c 就变成了一个汉字 “运”,如此绕过转义。若数据库是 GBK 格式而非默认的 UTF-8 格式,可利用两个 url 编码是一个汉字的特点,组合一个汉字从而解决”\“问题,完成单引号的逃逸。

⑧ 数字型注入::
  访问页面时经常会出现 http:xxx.admin.com?id=1 这种形式的 url,这个时候我们输入 and 1=1 与 and 1=2, 进行判定看是否会出现 and 1=1 回显正常,and 1=2 回显不正常的情况。如果出现了我们一般就认为这里存在注入,并且是数字型注入。如果没有出现那么并不能排查这里没有注入,只是排除这里不存在数字型的注入。

⑨ 字符型注入:
  url 后输入’ and 1=1 and ‘1’=’1,’ and 1=2 and ‘1’=’1。看是否会出现报错的现象。如果存在我们可以进一步的闭合我们的语句。

⑩ http 头部注入:
  user-agent: 判定用户使用的操作系统,以及使用的浏览器的版本。
  cookie: 判定用户的身份,进行 session 跟踪可以存储在用户本地终端上的数据,简单理解为用户的一张身份辨别卡。
  x-forwarded-for: 是用来识别通过 HTTP 代理或负载均衡方式连接到 Web 服务器的客户端最原始的 IP 地址的 HTTP 请求头字段。
  client-ip: 数据库保存客户端 IP 的参数。
  rerferer: 浏览器向 web 端表明自己从哪个连接而来。
  host: 客户端指定自己想访问的 WEB 服务器的域名 / IP 地址和端口号。

3 Statement和PreparedStatement区别和联系

① 相同点:
  都是sql执行对象,可以实现增删改查
  都是接口,Statement是PreparedStatement父接口
② 区别:
  创建对象的语法不同
  执行CRUD的方法不同
  Statement是执行sql时编译,多次执行就编译多次;PreparedStatement可以编译一次,多次反复执行
  PreparedStatement可以防止sql注入
  PreparedStatement采用预编译机制,性能更高

4 通过PreparedStatement解决sql注入

  使用 Statement 语句对象,会将参数直接拼接到 SQL 中执行,此时参数若改变了SQL的语法结构,执行结果就会出问题,如登录查询的 SQL 中,用户名参数值为: ’ or 1=1 or’, 此时,填写的密码无论是什么,登录都会成功, 这就是 SQL 注入的问题.
  此问题可通过预编译语句对象,预先发送带有占位符的 SQL 到数据库中进行编译, 语句结构固定下来,设置参数给对应的占位符,然后再执行 SQL,这样无论是什么参数,都不会再改变 SQL 的语法结构,达到防止 SQL 注入问题的目的

5 代码演示

public class UserTest {/*使用账号密码执行登录:sql注入现象演示*/@Testpublic void test_statement() throws Exception{Connection connection = DruidUtil.getConnection();Statement statement = connection.createStatement();// 注释正确的帐号,通过sql注入可使用错误的帐号登录
//        String username="大黄";String ename="fgdr' or 1=1 or '";String password="123";String sql="SELECT * from t_employee WHERE ename='"+ename+"' and password='"+password+"'";System.out.println(sql);//传入的参数参与了sql编译过程所有造成sql注入现象ResultSet resultSet = statement.executeQuery(sql);if(resultSet.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}}/*使用账号密码执行登录:sql注入解决* 客户端传入的参数不能参与sql编译的过程,从而解决了注入的问题** */@Testpublic void test_preparedStatement() throws Exception{String username="qwewqe' or 1=1 or '";
//        String username="admin";String password="123";Connection connection = DruidUtil.getConnection();String sql="SELECT * from t_employee WHERE ename=? and password=?";PreparedStatement statement = connection.prepareStatement(sql);statement.setObject(1,username);statement.setObject(2,password);System.out.println(sql);ResultSet resultSet = statement.executeQuery();if(resultSet.next()){System.out.println("登录成功");}else{System.out.println("登录失败");}}
}

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

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

相关文章

LabVIEW进行癌症预测模型研究

LabVIEW进行癌症预测模型研究 癌症是一种细胞异常增生的疾病。随着年龄的增长,细胞分裂速度放缓,但癌细胞会失去控制地不断分裂,形成可能良性或恶性的肿瘤。 2012年的国际癌症数据显示,新发癌症病例和癌症相关死亡人数有所增加。…

Qt优秀开源项目之十九:跨平台记事本Notes

官网:https://www.get-notes.com github:https://github.com/nuttyartist/notes 一.特性 1.完全基于Qt和C 2.完全开源和跨平台(Linux、macOS、Windows) 3.运行速度快,界面美如画 4.支持Markdown 5.支持使用嵌套文件夹…

在Flutter中使用PhotoViewGallery指南

介绍 Flutter中的PhotoViewGallery是一个功能强大的插件,用于在应用中展示可缩放的图片。无论是构建图像浏览器、相册应用,还是需要在应用中查看大图的场景,PhotoViewGallery都是一个不错的选择。 添加依赖 首先,需要在pubspec…

多项创新技术加持,汉威科技危化品企业、化工园区两大智能化管控平台重磅发布

化工产业是我国支柱产业,化学品产值约占全球的40%,位列第一。石油化工、煤化工、化肥、制药、冶金、氢能源等产业持续升级迭代,化工园区作为重要载体,不断推动产业朝专业化、集约化方向发展。 近年来我国危险化学品领域重特大事故…

实现不同分辨率、不同缩放比例屏幕对vue显示的问题的适配解决

分析 我们使用适配常用的就是百分比 这个一般依托于父组件的宽度和高度 ,但是大部分父组件并没有设置宽度和高度,也没有继承其父组件的宽高 所以导致这个问题 另外,使用百分比有时候不生效 可以在设置宽度的时候使用vw 在设置高度的时候设置…

WebService技术--随笔1

1.WebService 发展史 创建阶段(1990 年代末至 2000 年代初):在这个阶段,XML-RPC 和 SOAP 协议被引入,为跨平台和跨语言的应用程序集成提供了基础。XML-RPC 提供了一种基于 XML 的远程过程调用机制,而 SOAP…

word图片点击放大,word图片双击放大

网上自己搜了半天,都是顾左右而言他,直接实践一下。 干货就是:调整word视图为阅读模式,双机图片 就能放大查看,然后还会有一个 放大镜供点击放大到整个屏幕。 其实挺好理解的,word跟wps不同,w…

【VSCode】自定义配置

VSCode自定义配置 Visual Studio Code (VSCode) 是一个强大的开源代码编辑器,支持丰富的自定义配置。下面是一些常见的自定义配置选项,你可以根据个人喜好和工作流程进行调整: 1. 主题和配色方案: 在 “settings.json” 中设置&#xff1a…

力扣labuladong——一刷day74

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣1305. 两棵二叉搜索树中的所有元素二、力扣872. 叶子相似的树 前言 二叉树的构造算法通用思路很简单,无非就是构造根节点,然后递…

我的2023 - git目录

.\0000 差旅 .\0000_BigEvent .\0000工时统计 .\000_CommonDoc .\000_Delay .\000_Done .\000_Drop .\000_参考 .\001_Cache .\11111111_zhy远程调试 .\20230802_参考项目 .\20230928_Ccz产品化 .\20231105_天津北京出差报告 .\20231207_libmodbus移植集成 .\20231213_cz原理图…

2024 年 8 款最佳数据恢复软件深度评测(Windows 和 Mac)

由于意外删除、格式化或损坏而立即丢失重要数据是一场噩梦。当您开始寻找 2024 年最好的数据恢复软件时,由于选项太多,您可能会不知所措。 2024 年 8 款最佳数据恢复软件深度评测 有些工具适用于 Windows,其他工具适用于 Mac,但并…

GZ029 智能电子产品设计与开发赛题第10套

2023年全国职业院校技能大赛高职组 “GZ029智能电子产品设计与开发”赛项赛卷十 题目:模拟工业传送带物品检测系统的设计与开发 1 竞赛任务 在智能电视机上播放工业传送带传输物品视频,模拟工业传送带物品检测系统(以下简称物品检测系统&…

如何在Spring Boot中集成RabbitMQ

如何在Spring Boot中集成RabbitMQ 在现代微服务架构中,消息队列(如RabbitMQ)扮演了关键的角色,它不仅能够提供高效的消息传递机制,还能解耦服务间的通信。本文将介绍如何在Spring Boot项目中集成RabbitMQ,…

python中else的细节

if-else 首先我们都知道else可以和if共同使用,如果if条件没有执行,就会去执行else语句 a100 if a100:print("if 语句执行了") else:print("else语句执行了") a10 if a100:print("if 语句执行了") else:print("else…

8-二分-索引二分-H 指数

这是索引二分的第八篇算法,力扣链接 给你一个整数数组 citations ,其中 citations[i] 表示研究者的第 i 篇论文被引用的次数。计算并返回该研究者的 h 指数。 根据维基百科上 h 指数的定义:h 代表“高引用次数” ,一名科研人员的 …

【游戏篇】Scratch之小猴子接水果

【作品展示】小猴子接水果 操作:点击小绿旗,按下键盘左右键控制小猴子移动拿到水果,同时也要躲避炸弹。

#HarmonyOS:应用的包名配置--应用图标和标签配置--配置链接

配置相关 https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/application-component-configuration-stage-0000001478340869-V2 应用的包名配置 应用需要在工程的AppScope目录下的app.json5配置文件中配置bundleName标签,该标签用于标识应用的唯…

【自主探索】rrt_exploration 源码解析

各文件运行顺序&#xff1a; simple.launchglobal_rrt_detector.cpplocal_rrt_detector.cppfilter.pyassigner.py 文章目录 一、simple.launch二、global_rrt_detector.cpp三、local_rrt_detector.cpp四、filter.py五、assigner.py 一、simple.launch <!-- Launch file fo…

如何排查线上问题的?

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、预警层面 1.1 做好监控告警 1.2 定位报警层面 二、近期版本 2.1 判断最近有没有发版本 2.2 回归最近的版本 三、日志告警…

用队列实现栈,力扣

题目地址&#xff1a; 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; 难度&#xff1a;简单 今天刷用队列实现栈&#xff0c;大家有兴趣可以点上看看题目要求&#xff0c;试着做一下。 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 方法…