# 技术学习 **Repository Path**: tu-zhenjin/technical-learning ## Basic Information - **Project Name**: 技术学习 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-03-06 - **Last Updated**: 2024-03-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 技术学习 > 实习学到的技术 ## 报表开发 ==SQL优化== 对于要查询的表过多,联十几张表的需求情况下,SQL执行本身很慢....需要尽量使用字段冗余手段,用到哪个字段就填那几个字段。像过滤条件可以多填写,租户过滤,数据存在过滤,减少过多数据联查,导致SQL语句执行过慢。该联合起来查的绝对不能分开查询再串起来。如果联表过多情况下,尽量使用子查询。对于中间表联查,可以加过滤条件就加,减少数据联查。 具体见重机报表优化。 ## Java访问局域网共享文件夹 Java访问局域网共享文件夹 ```java /** * @author 涂 * @version 1.0 * 功能:对局域网共享文件夹下的一个文件夹所有文件读取保存到本地目录 */ import java.io.*; public class FolderIOUtil { public static void main(String[] args) throws IOException { java.io.File shareFile = new java.io.File("\\\\192.168.2.12\\tutu"); if (shareFile.exists()) { // 获取共享文件夹中文件列表 File[] Files = shareFile.listFiles(); for (File File : Files) { createFile(File); } System.out.println("文件读取完成~"); } } public static void createFile(File remoteFile) { InputStream in = null; OutputStream out = null; try { File localFile = new File("F:/Temp/" + remoteFile.getName()); in = new BufferedInputStream(new FileInputStream(remoteFile)); out = new BufferedOutputStream(new FileOutputStream(localFile)); byte[] buffer = new byte[1024*1024]; //读取长度 int len = 0; while ((len = in.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } out.flush(); System.out.println("文件"+remoteFile.getName()+"读取成功"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (Exception e) { e.printStackTrace(); } } } } ``` java访问具体文件读取并保存 ```sql import java.io.*; /** * @author 涂 * @version 1.0 * Java访问局域网具体文件读取下来 */ public class FileIOUtil { public static void main(String[] args){ java.io.File shareFile = new java.io.File("\\\\192.168.2.12\\tutu\\111.txt"); String absolutePath = shareFile.getAbsolutePath(); // 获取绝对路径 // 查找倒数第二个目录分隔符的索引 int lastIndex = absolutePath.lastIndexOf(File.separatorChar); int secondLastIndex = absolutePath.substring(0, lastIndex).lastIndexOf(File.separatorChar); String parentDirectoryName = ""; if (lastIndex != -1 && secondLastIndex != -1) { parentDirectoryName = absolutePath.substring(secondLastIndex + 1, lastIndex); System.out.println("上一层目录名称: " + parentDirectoryName); } else { System.out.println("无法提取上一层目录名称"); } File localFile = new File("F:/Temp/" +parentDirectoryName+shareFile.getName()); InputStream in = null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream(shareFile)); out = new BufferedOutputStream(new FileOutputStream(localFile)); byte[] buffer = new byte[1024*1024]; //读取长度 int len = 0; while ((len = in.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } out.flush(); System.out.println("文件"+shareFile.getName()+"读取成功"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (Exception e) { e.printStackTrace(); } } } } ``` **小Tips:** 创建文件方法:文件流要关闭,或者使用try() 这种语法不用显示关闭流,以免浪费资源。 --- 下面开始每天学到一些东西 # start ## ELasticSearch 1. 在单节点上安装 Elasticsearch。 2. 通过官方文档的快速入门了解 Elasticsearch,理解索引、文档、倒排索引等概念。 3. 学习各类查询、文档的维护和索引的维护,掌握基本的使用方法。 4. 学习搭建集群和了解内部分片原理,体会 Elasticsearch 的含义,可以进行一些简单的生产操作。 5. 深入学习各类聚合分析,掌握基本使用方法。 6. 深入理解倒排索引、bitmap、docvalues 等数据结构的区别,以及它们在具体应用场景中的使用。 7. 学习文档更新的内部原理,理解提交点、段合并、版本内外控制等概念。 8. 学习 Elasticsearch 官方文档中提供的各种参数,包括索引的 mapping、分布式、查询和文档维护相关的参数。只有掌握原理,才能理解每个参数的含义,并根据实际业务需求有针对性地使用 Elasticsearch。 9. 深入学习搜索和控制相关度的相关原理,包括分片查询原理、相关度评分的内部算法,以及控制相关度的各种手段。 10. 引用官方文档里的一句话:“控制相关度是最后10%要做的事情”。 -- 相关小知识 >幂等的请求是指**多次执行相同的请求对资源的影响与执行一次相同的请求的影响相同** ## HTTP 协议的幂等性 以我们常见的四种 HTTP method 为例,加深我们对幂等这个概念的理解。 ### GET GET 操作是`幂等`的,原因是 GET 操作根本不会对服务器产生任何修改。有人可能会说我们访问 GET /last_news 可能每次拿到的结果都不一样,这里幂等的一致性指的是数据库的最终的存储结果,而不是调用方拿到的返回结果 ### PUT PUT 方法通常是对已经存在的资源进行修改,也是`幂等`的。比如我们发起多个把 A 替换成 B 的请求,最终的结果还会是 B ### DELETE DELETE 方法也是`幂等`的,例如我们连续发起多个对 A 的删除请求,如果第一个成功的话,后面的请求都应返回资源找不到的错误 ### POST POST 一般是指新增资源,`不是幂等`的。如果连续发起三个 A 资源的增加,最终的结果会是三个 A 资源,而不是一个 ## nacos 配置中心 ![image-20240325144108846](README.assets/image-20240325144108846.png) ## kafka 一种发布/订阅的消息队列,需要搭配zookeeper使用。