文件搜索项目知识介绍

    • 项目背景
    • SQLite介绍
      • SQLite、驱动包下载
      • SQLite使用
      • SQLite和MySQL区别
    • JDBC搭配SQLite
      • JDBC原理-创建连接
      • JDBC原理-关闭连接
      • 添加和发送SQL
      • JDBC-事务开启和提交
    • 打包.exe文件
    • 线程池线程数量问题

项目背景

需求上:因为Windows的文件搜索工具搜索速度十分的慢;让大家苦不堪言;是否能利用以前学习的知识实现这样子的一个功能呢?

项目优点:
1:搜索速度相近于世面众多文件搜索工具;文件大小只需13.4MB
2:灵动搜索;能支持文件名字拼音进行搜索;只需会读即可搜索
3:能自主灵活改动;能随时根据自己和体验人员的需求进行扩展和升级。
4:无广告、无会员、更新的选择权在于用户;不自主占用过多内存

SQLite介绍

SQLite、驱动包下载

在这里插入图片描述

在这里插入图片描述
解压后三个文件:我们只取sqlite3.exe即可
在这里插入图片描述

在这里插入图片描述

SQLite使用

双击打开:它会提升连接到一个临时内存数据库;使用.open FILENAME重新打开一个永久数据库
在这里插入图片描述
我们回到exe文件里:shift+右键空白处
在这里插入图片描述
在这里插入图片描述

SQLite和MySQL区别

1:它不是客户端服务器结构;直接就是一个可执行程序;数据库直接文件的方式表示
2:操作大同小异;但是极个别不一样;SQLite是不需要create database/use /drop database/show databases……
所以我们要删除、显示数据库直接去文件里操作即可
3:SQLite轻量;一个数据库只有1M左右;给别人使用总不可能给别人带个几百MB的MySQL
4:sqlite中并不需要选中表;直接操作即可因为我们增删查改都会带上表名;它会去匹配是哪个表的;这个非常符合我们在用户电脑中我的带上的数据库文件创建表然后就能直接使用。要显示知道数据库有哪些表:.tables (MySQL里的show table不适合用)
5:SQLite插入数据会锁整个表;读和读之间无竞争;写和读、写和写有竞争。MySQL默认隔离级别是可重复读;使用MVCC和锁机制保证的隔离性;读和读之间使用共享锁不会锁竞争;写使用排它锁会发生竞争。插入数据时使用行级锁。
6:SQLite是没有int类型;但是它为了兼容其它数据库;使用支持我们写int;它内部自动进行转换成Integer;但是你要想使用自增主键就必须使用Integer

JDBC搭配SQLite

JDBC原理-创建连接

本质都是通过 Connection 对象才能连接到相应的数据库;获取建立连接有两种方式如下:
1:DriverManager;驱动管理;早期的jdbc版本你是需要显示加载驱动程序Class.forName(“com.mysql.jdbc.Driver”);4.0以后的版本引入了自动驱动程序加载机制后;你直接创建连接即可

Class.forName("com.mysql.jdbc.Driver");//加载驱动程序
DriverManager.getConnection("jdbc:mysql://localhost:3306/test&user=root&password=root&useUnicode=true&characterEncoding=UTF-8");//或者String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "user";String password = "password";Connection connection = DriverManager.getConnection(url, username, password);

2:DataSoure;可以被视为一个数据源池,其中包含了预先创建的Connection对象,应用程序可以从中获取连接对象并使用。

  ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/liao?characterEncoding=utf8&useSSL=false");((MysqlDataSource)dataSource).setUser("root");((MysqlDataSource)dataSource).setPassword("111111");

两者的区别:
1:相当于一个是直接创建 Connection 对象就需要设置相关连接信息。而另一个是它内部帮你创建好;你通过DataSoure设置相应的连接信息:dataSource.setURL(“jdbc:mysql://127.0.0.1:3306/liao?characterEncoding=utf8&useSSL=false”);。本质都是在设置Connection对象。
2:DataSource是这些Connection对象是它帮你创建好存在那里;你只需要通过dataSource设置相应信息;然后通过这个dataSource对象获取这个连接即可。相当于一个懒汉模式;一个饿汉模式。
3: Connection.close时候;虽然都是断开连接;释放资源;DataSource是把Connection还给这个连接池;就是说我现在用完了;现在你其它人可以复用这个连接了

JDBC原理-关闭连接

使用完成connection、Resultset、statement对象都需要回收

      public static void close(Connection connection, Statement statement, ResultSet resultSet) {if (resultSet != null) {try {resultSet.close();} catch (SQLException e) {e.printStackTrace();}}if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (connection != null) {try {connection.close();} catch (SQLException e) {e.printStackTrace();}}}

添加和发送SQL

Statement对象主要是将SQL语句发送到数据库中;通常使用的是PreparedStatement;PreparedStatement是Statemen子类
如何获取这个对象:

//建表特殊一点
connection=数据源对象.getConnection();
statement=connection.createStatement();
//
String sql="insert into file_meta values(null,?,?,?,?,?,?,?)";
preparedStatement=connection.prepareStatement(sql);

这个对象有什么好处:
好处1: 预编译;执行之前,会先将SQL语句预编译,并缓存编译后的执行计划。这样可以提高性能,尤其是需要多次执行相同或类似的SQL语句时。
好处2:支持使用占位符(?)来表示参数,然后通过调用setXXX()方法为占位符设置具体的参数值。更安全(能防SQL注入)、数据和SQL分开更好阅读
好处3:对于重复执行相同的SQL语句(如批量插入),由于预编译的存在,性能通常比Statement更好。就是它会在MySQL这些数据库服务器缓存的执行计划和结果。

如何真正将sql发送:
executeQuery() 方法执行后返回Resultset单个结果集的,通常用于select语句。如何遍历这个结果集:

while (resultSet.next()) {
String name=resultSet.getString("name");
}

executeUpdate()方法返回值是一个整数,指示受影响的行数,通常用于update、insert、delete;create创建表也是用这个提交的;语句

JDBC-事务开启和提交

 connection.setAutoCommit(false);//开启事务;先关闭自动提交的功能String sql="insert into file_meta values(null,"123")";preparedStatement=connection.prepareStatement(sql);String sql2="insert into file_meta values(null,"234")";preparedStatement=connection.prepareStatement(sql2);preparedStatement.addBatch();//在这里累计//执行SQL;preparedStatement.executeBatch();//执行完提交事务;使用commit提交事务connection.commit();

使用你得try catch包裹一下;出现异常回滚 connection.rollback(); 最后finally释放资源

打包.exe文件

对于学习来说兴趣是最好的老师;能把一个程序给身边的亲朋好友使用;这无疑能给我们提供很大的学习动力。想要别人能成功的使用你的程序;两种常见手段
第一种:web项目部署云服务器上;别人能通过网络使用你的程序
第二种:把你的程序打包成一个.exe可执行文件给别人使用

需要将依赖的资源一起打包成 JAR 文件,可以使用 Maven 插件来实现。常见的 Maven 插件是 maven-assembly-plugin 和 maven-shade-plugin。使用 maven-assembly-plugin如下:
1:添加配置

   <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.3.0</version><configuration><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin></plugins></build>

2:
在这里插入图片描述
java_everything-1.0-SNAPSHOT.jar:只包含了项目自身的编译输出(类文件)和资源文件。不包含任何依赖项或第三方库,也叫"瘦"JAR。
java_everything-1.0-SNAPSHOT-jar-with-dependencies.jar:这个 JAR 包是使用 maven-assembly-plugin 插件创建的,它将项目及其所有的依赖项一起打包到一个单独的可执行 JAR 文件中,也叫"胖"JAR。

3:打包成.exe文件
需要用exe4j软件:操作步骤如下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4:测试效果
先让我们本地Java环境失效看看能否执行
在这里插入图片描述

在这里插入图片描述
jre一定得是在同级下;因为打包时配置的是同级目录下;否则会出现
在这里插入图片描述

在这里插入图片描述

线程池线程数量问题

在这里插入图片描述

这里涉及一个问题:使用线程池添加任务;那么线程池的数量应该多少合适?
解决上述问题,可以采用测试的方法来验证适合的线程池数量,并使用计时方法来测量执行时间。但是会有指令重排序问题;解决这个问题;通过线程之间通信;等添加任务完成再通知它结束计时。但是我怎么知道线程池什么时候执行结束呢?
方法1:

threadPool.getTaskCount() != threadPool.getCompletedTaskCount();//统计已执行的任务和总任务比较。但是不准确;因为任务是一直在变化和添加;所以你需要写轮询的方式去判断。也可能我只想判断当前这个任务的三个线程是否执行完;中途别人又添加任务了;那就不精准了。

方法2:

ExecutorService executor=Executors.newFixedThreadPool(10);
FutureTask<Integer> task=new FutureTask(()->{//任务return -1;
});
executor.submit(task);
int result=task.get();//这个方法就能等待所有任务执行完毕并返回结果

方法3:特殊场景;可以使用计数器的方式;因为给线程池添加任务是内存进行非常快;而真正执行更新数据操作硬盘是相对非常慢。所以我们每向线程池添加一个任务就计数器++;线程池执行完一个任务就计数器–。但是这又有一个问题;使用普通计数器会原子性问题。这里能通过使用原子类解决问题。

简化后代码:

public class FileManager {Object object=new Object();private AtomicInteger taskCount = new AtomicInteger(0);//计数器public void scanAll(File basePath) {System.out.println("[FileManager] scanAll 开始!");long beg = System.currentTimeMillis();scanAllByThreadPool(basePath);try {synchronized (object){object.wait();}} catch (InterruptedException e) {e.printStackTrace();}long end = System.currentTimeMillis();System.out.println("[FileManager] scanAll 结束! 执行时间: " + (end - beg) + " ms");}private static ExecutorService executorService = Executors.newFixedThreadPool(100);private void scanAllByThreadPool(File basePath) {// 计数器自增taskCount.getAndIncrement(); // taskCount++// 扫描操作, 放到线程池里完成.executorService.submit(new Runnable() {@Overridepublic void run() {try {scan(basePath);//执行任务} finally {//写在这里防止中间出问题--失败而永远计数器达不到0taskCount.getAndDecrement(); // taskCount--if (taskCount.get() == 0) {// 如果计数器为 0 ; 通知主线程结束计时了.synchronized (object){object.notify();}}}}});
}

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

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

相关文章

虚幻学习笔记11—C++结构体、枚举与蓝图的通信

一、前言 结构体的定义和枚举类似&#xff0c;枚举的定义有两种方式。区别是结构体必须以“F”开头命名&#xff0c;而枚举不用。 额外再讲了一下蓝图生成时暴露变量的方法。 二、实现 2.1、结构体 1、定义结构体 代码如下&#xff0c;注意这个定义的代码一定要在“UCLASS()”…

从零构建属于自己的GPT系列6:模型本地化部署2(文本生成函数解读、模型本地化部署、文本生成文本网页展示、代码逐行解读)

&#x1f6a9;&#x1f6a9;&#x1f6a9;Hugging Face 实战系列 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在PyCharm中进行 本篇文章配套的代码资源已经上传 从零构建属于自己的GPT系列1&#xff1a;数据预处理 从零构建属于自己的GPT系列2&#xff1a;模型训…

ThinkPHP连接ORACLE数据库教程

目录 概念基本步骤详细操作问题排除参考 概念 要连接Oracle数据库&#xff0c;必须有两个东西&#xff0c;一个PHP官方写的扩展&#xff0c;一个Oracle官方写的客户端PHP是通过扩展去操作oralce客户端连接的服务端数据库&#xff0c;所以两个都不能少&#xff0c;而且版本必须…

大数据讲课笔记1.4 进程管理

文章目录 零、学习目标一、导入新课二、新课讲解&#xff08;一&#xff09;进程概述1、基本概念2、三维度看待进程3、引入多道编程模型&#xff08;1&#xff09;CPU利用率与进程数关系&#xff08;2&#xff09;从三个视角看多进程 4、进程的产生和消亡&#xff08;1&#xf…

5V低压步进电机驱动芯片GC6150,应用于摄像机,机器人 医疗器械等产品中。具有低噪声、低振动的特点

GC6150是双通道5V低压步进电机驱动器&#xff0c;具有低噪声、低振动的特点&#xff0c;特别适用于相机变焦对焦系统、万向架、摇头机等精度、低噪声STM控制系统&#xff0c;该芯片为每个通道集成了一个256微步的驱动器。通过SPI & T2C接口&#xff0c;客户可以方使地调整驱…

Python+Appium自动化测试之元素等待方法与重新封装元素定位方法

在appium自动化测试脚本运行的过程中&#xff0c;因为网络不稳定、测试机或模拟器卡顿等原因&#xff0c;有时候会出现页面元素加载超时元素定位失败的情况&#xff0c;但实际这又不是bug&#xff0c;只是元素加载较慢&#xff0c;这个时候我们就会使用元素等待的方法来避免这种…

下降路径最小和/最小路径和(dp问题)

1.状态表示 2.状态转移方程 3.初始化 4.填表 从上往下 5.返回值 dp表最后一行的最小值 ------------------------------------------------------------------------------------------------------------------------------- 1.状态表示 2.状态转移方程 3.初始化 4.填表 上…

【教程】app备案流程简单三部曲即可完成

APP备案流程包括以下步骤&#xff1a; 1. 开发者实名认证&#xff1a;在提交备案申请之前&#xff0c;开发者需要通过移动应用开发平台进行实名认证。这个步骤需要提供身份证号码、姓名、联系方式等信息&#xff0c;并上传相关证件照片或扫描件。 2. 应用信息登记&#xff1a…

使用 PyTorch 完全分片数据并行技术加速大模型训练

本文&#xff0c;我们将了解如何基于 PyTorch 最新的 完全分片数据并行 (Fully Sharded Data Parallel&#xff0c;FSDP) 功能用 Accelerate 库来训练大模型。 动机 随着机器学习 (ML) 模型的规模、大小和参数量的不断增加&#xff0c;ML 从业者发现在自己的硬件上训练甚至加…

小程序域名SSL证书能用免费的吗?

众所周知&#xff0c;目前小程序要求域名强制使用https协议&#xff0c;否则无法上线。但是对于大多数开发者来说&#xff0c;为每一个小程序都使用上付费的SSL证书&#xff0c;也是一笔不小的支出。那么小程序能使用免费的SSL证书吗&#xff1f; 答案是肯定的。目前市面上可选…

HCIP---RSTP/MSTP

文章目录 目录 文章目录 前言 一.RSTP诞生背景 二.RSTP对比STP的快速收敛机制 端口角色变化 接口状态变化 RSTP-BPDU 指定端口- P/A机制 BPDU发送变化 端口状态快速切换 优化拓扑变更机制 三.MSTP MSTP诞生背景 MSTP相关概念 MSTP配置 总结 前言 STP协议虽然能够解决环…

记录 | xftp远程连接两台windows

1、打开openssh 设置 -> 应用 -> 可选功能 -> 添加功能 -> OpenSSH 客户端&#xff0c;将 ssh 客户端安装将两台电脑的 ssh 开启&#xff0c;cmd 中输入 net start sshd2、配置 win10 账号密码 3、进行 xftp 连接

租一台服务器多少钱决定服务器的价格因素有哪些

租一台服务器多少钱决定服务器的价格因素有哪些 大家好我是艾西&#xff0c;服务器这个名词对于不从业网络行业的人们看说肯定还是比较陌生的。在21世纪这个时代发展迅速的年代服务器在现实生活中是不可缺少的一环&#xff0c;平时大家上网浏览自己想要查询的信息等都是需要服…

加减乘除简单吗?不,一点都不,利用位运算实现加减乘除(代码中不含+ - * /)

文章目录 &#x1f680;前言&#x1f680;异或运算以及与运算&#x1f680;加法的实现&#x1f680;减法的实现&#x1f680;乘法的实现&#x1f680;除法的实现 &#x1f680;前言 这也是阿辉开的新专栏&#xff0c;知识将会很零散不成体系&#xff0c;不过绝对干货满满&…

多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测

多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SAO-CNN-BiGRU-Multihead-Attention多头注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 MATLAB实现SAO-CNN-B…

CommonJs模块化实现原理ES Module模块化原理

CommonJs模块化实现原理 首先看一个案例 初始化项目 npm init npm i webpack -D目录结构如下&#xff1a; webpack.config.js const path require("path"); module.exports {mode: "development",entry: "./src/index.js",output: {path: p…

硬件开发笔记(十六):RK3568底板电路mipi摄像头接口原理图分析、mipi摄像头详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/134922307 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

Redis缓存主要异常及解决方案

1 导读 Redis 是当前最流行的 NoSQL数据库。Redis主要用来做缓存使用,在提高数据查询效率、保护数据库等方面起到了关键性的作用,很大程度上提高系统的性能。当然在使用过程中,也会出现一些异常情景,导致Redis失去缓存作用。 2 异常类型 异常主要有 缓存雪崩 缓存穿透 缓…

【sqli靶场】第二关和第三关通关思路

目录 前言 一、sqli靶场第二关 1.1 判断注入类型 1.2 判断数据表中的列数 1.3 使用union联合查询 1.4 使用group_concat()函数 1.5 爆出users表中的列名 1.6 爆出users表中的数据 二、sqli靶场第三关 2.1 判断注入类型 2.2 观察报错 2.3 判断数据表中的列数 2.4 使用union联合…

什么是 web 组态?web 组态与传统组态的区别是什么?

组态软件是一种用于控制和监控各种设备的软件&#xff0c;也是指在自动控制系统监控层一级的软件平台和开发环境。这类软件实际上也是一种通过灵活的组态方式&#xff0c;为用户提供快速构建工业自动控制系统监控功能的、通用层次的软件工具。通常用于工业控制&#xff0c;自动…