<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[dhklsl的专栏]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/dhklsl</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; dhklsl]]></copyright><item><title><![CDATA[关于计算两个文章的克拉默系数]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/162408347</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/162408347</guid><author>dhklsl</author><pubDate>Mon, 29 Jun 2026 14:40:10 +0800</pubDate><description><![CDATA[计算两个csv文件克拉默系数]]></description><category></category></item><item><title><![CDATA[生产上应用服务器日志报数据库账号被锁定却不影响应用访问的问题]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/156006042</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/156006042</guid><author>dhklsl</author><pubDate>Wed, 17 Dec 2025 14:00:50 +0800</pubDate><description><![CDATA[12月13日我们投产先投产应用的业务功能上线，然后投产一批shell脚本，这批shell脚本和应用连的是同一个数据库，且使用的账号和密码都一样。当应用服务器用相同账号密码访问数据库时，由于数据库已经锁定了该账号，所以应用服务器日志就报错了账号锁定的错误。就是文章开头所说的，生产应用服务器从12月14日凌晨，应用日志打印了很多数据库账号锁定的报错信息，但是应用仍然可以查询该数据库的数据。既然应用服务打印了账号锁定，说明无法连接到数据库了，为什么在应用的页面可以查询该数据库数据并展示到前端页面呢？]]></description><category></category></item><item><title><![CDATA[关于获取某目录及子目录下所有文件且不包含隐藏文件]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/149781348</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/149781348</guid><author>dhklsl</author><pubDate>Wed, 30 Jul 2025 16:56:08 +0800</pubDate><description><![CDATA[关于获取目录及子目录下所有文件是常遇到的功能，一般通过递归遍历实现。但是利用File.listFiles(),在linux系统上无法获取含有中文名的文件的。这里是通过java.nio.file来实现。最近比较忙，很少写blog了！]]></description><category></category></item><item><title><![CDATA[利用余弦相似度在大量文章中找出抄袭的文章]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/146251152</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/146251152</guid><author>dhklsl</author><pubDate>Fri, 14 Mar 2025 10:40:33 +0800</pubDate><description><![CDATA[我前面的2篇文章分别讲了如果利用余弦相似度来判断2篇文章的相似度，来确定文章是否存在抄袭，和余弦相似度的原理，即余弦相似度到底是怎么来判断文章的相似性高低的等等。这一篇再说下，对于文章字数多和大量文章时，如果找到两篇相似度高的文章。这里就需要考虑内存溢出的风险了。所以对第一篇的代码进行了改造。在一定程度上降低了内存溢出的风险。pom依赖这里和第一篇略有不同，即第一篇采用的hankcs包实现的余弦相似度算法。本篇文章时通过math3包实现的。但是原理相同。代码如下。]]></description><category></category></item><item><title><![CDATA[对比文章相似度的余弦相似度算法的原理]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/146250139</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/146250139</guid><author>dhklsl</author><pubDate>Fri, 14 Mar 2025 10:08:42 +0800</pubDate><description><![CDATA[近期不是项目遇到对比代码的相似度，来判断代码是否存在抄袭嘛。通过研究采用了余弦相似度来对比。既然接触的一个新的东西，怎么也得研究下吧。]]></description><category></category></item><item><title><![CDATA[JAVA利用余弦相似度判断论文是否存在抄袭]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/146235070</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/146235070</guid><author>dhklsl</author><pubDate>Thu, 13 Mar 2025 16:38:55 +0800</pubDate><description><![CDATA[近期项目遇到一个问题。单位每年都会举行编程大赛。为了防止参数队伍的代码存在抄袭现象。需要添加一个抄袭提醒功能。经过在网上查询，有simHash和余弦相似度比较常用。现在给出一个根据余弦相似度来判断文章是否存在抄袭的简单例子。]]></description><category></category></item><item><title><![CDATA[定时调度多台服务器部署只有一个台服务调度执行的解决方案]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/145176306</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/145176306</guid><author>dhklsl</author><pubDate>Fri, 17 Jan 2025 14:24:28 +0800</pubDate><description><![CDATA[一、项目背景、项目背景近期项目遇到要实现一个定时调度，要求每隔3分钟调其他系统接口一次来获取数据并存入我们gbase数据库。而我们项目在K8S中采用多实例部署。每次投产部署采用的轮询部署。比如我们有6个实例，会先部署其中2台实例，部署成功后再部署2台实例。本来我们有调度工具，但是调用频度最小是天，无法满足隔几分钟调一次的需求。另外项目规定不建议使用定时任务@Scheduled注解。这些要求叠加在一起，要通过后端实现，还是第一次遇到。现总结如下。二、需要解决的问题三、逐个击破。]]></description><category></category></item><item><title><![CDATA[CyclicBarrier复杂场景示例]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143770887</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143770887</guid><author>dhklsl</author><pubDate>Thu, 14 Nov 2024 14:43:59 +0800</pubDate><description><![CDATA[后，计数器会减1，并且await()方法会让当前线程阻塞，等待计数器减为0的时候，所有在await()上等待的线程被唤醒，然后继续向下执行，比如这样一个场景，公司组织10名员工去旅游，先组织大家吃饭,吃完饭在一起坐车去景点。CyclicBarrier内部相当于有个计数器（构造方法传入的），每次调用。，第一次用于等待所有人到达后开饭，第二次用于等待所有人上车后驱车去下一景点。坐车：必须10名员工都上车了，才能发车。要求：吃饭：必须10名员工都到座位了才能一起吃饭。]]></description><category></category></item><item><title><![CDATA[CyclicBarrier使用详解及遇到的坑]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143630382</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143630382</guid><author>dhklsl</author><pubDate>Fri, 08 Nov 2024 17:17:44 +0800</pubDate><description><![CDATA[当线程到达屏障位置时，调用await()方法进行阻塞，直到所有线程到达屏障位置时，所有线程才会被释放，而。CyclicBarrier每调用一次await()方法都将使阻塞的线程数+1，只有阻塞的线程数达到设定值时屏障才会打开，允许阻塞的所有线程继续执行。：与await()类似，但是设置了超时时间，如果超过指定的时间后，仍然还有线程没有到达屏障点，则等待的线程会被唤醒并执行后续操作。：表示线程到达屏障点，并等待其它线程到达，返回值表示当前线程在屏障中的位置（第几个到达的）。：获取当前正在等待的线程数量。]]></description><category></category></item><item><title><![CDATA[关于CountDownLatch失效问题]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143613903</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143613903</guid><author>dhklsl</author><pubDate>Fri, 08 Nov 2024 11:18:29 +0800</pubDate><description><![CDATA[这个语句就可以看出，10秒钟后主线程也会执行，那么上面的10个线程如果每个任务的耗时都超过10秒才能出现主线程比子任务输出早的情况。后面生成的所有用户年度账单都是空，且数据库都有每个用户的账单。而且子任务的输出顺序也对了，是从thread10到thread1依次输出，虽然thread10耗时最长，也是第一个输出了!原因是spring托管的bean都是单例的，第一次调用结束后latch.getCount()已经是0了，然后后面的调用就不会等待前面子任务完成就开始执行主线程任务了。具体原因我会过几天在公布吧！]]></description><category></category></item><item><title><![CDATA[springboot配置logback.xml遇到的几个问题]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143407062</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143407062</guid><author>dhklsl</author><pubDate>Thu, 31 Oct 2024 18:15:38 +0800</pubDate><description><![CDATA[首先，默认情况下，logback.xml文件是放在类目录下，即resources文件下。2、就是在resources目录下没有任何logback的配置文件，但是项目也可以运行，代码里输出的log.info日志同样也可以输出。原因是springboot对于resources下没有logback配置文件时，会使用默认的配置文件，就是不能对logback进行个性化配置。另外，logback的配置文件也可以放在resources之外的目录下，比如放到项目根目录下的子目录里，也可以通过配置获取到。]]></description><category></category></item><item><title><![CDATA[logback日志脱敏后异步写入文件]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143238323</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143238323</guid><author>dhklsl</author><pubDate>Fri, 25 Oct 2024 17:06:55 +0800</pubDate><description><![CDATA[这种情况确实也能达到脱敏的目的，但是如果代码中有好多info日志输出，那么都需要改动，工作量太大，还容易拉下没有改动的地方。大家项目中肯定都会用到日志打印，目的是为了以后线上排查问题方便，但是有些企业对输出的日志包含的敏感(比如：用户身份证号，银行卡号，手机号等)信息要进行脱敏处理。大概思路是，需要自己写脱敏转换器，然后引入logback.xml中，异步写入文件比较方便，网上好多资料，大家可以自行查询。大概思路，就是创建一个切面，在调用info方法前把打印内容通过上面的工具类脱敏后在打印。]]></description><category></category></item><item><title><![CDATA[transient关键字详解]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143190906</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143190906</guid><author>dhklsl</author><pubDate>Wed, 23 Oct 2024 19:03:16 +0800</pubDate><description><![CDATA[今天没打算写blog，在看一篇关于多线程环境下SimpleDateFormat线程不安全的问题，一般我们都知道多线程下这个是不安全，但是为什么不安全不太清楚，我在看的这篇文章讲的比较透彻，我根据文章中讲结合SimpleDateFormat源码简单看了下，发现了里面有些成员变量被transient关键字修饰了，以前还没遇到过这个问题，就大概了解了下。在序列化对象时，对于一些特殊的数据成员（如用户的密码，银行卡号等），为了在传输过程中不传输这些敏感信息，我们不想用序列化机制来保存它。这个过程就是序列化。]]></description><category></category></item><item><title><![CDATA[在ftp服务器执行linux命令或者shell脚本]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143162950</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143162950</guid><author>dhklsl</author><pubDate>Tue, 22 Oct 2024 17:05:26 +0800</pubDate><description><![CDATA[/只能执行一条指令（也可执行符合指令）前段时间开发个功能是在ftp服务器上执行一些linux命令，以前没有接触过这些，不知道是怎么实现的。说明：各命令的执行给果，不会影响其它命令的执行。换句话说，各个命令都会执行，但不保证每个命令都执行成功。说明：若前面的命令执行成功，才会去执行后面的命令。这样可以保证所有的命令执行完毕后，执行过程都是成功的。说明：||是或的意思，只有前面的命令执行失败后才去执行下一条命令，直到执行成功一条命令为止。2）每个命令之间用&&隔开。3）每个命令之间用||隔开。]]></description><category></category></item><item><title><![CDATA[从远程ftp服务器下载和上传文件]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143158592</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143158592</guid><author>dhklsl</author><pubDate>Tue, 22 Oct 2024 15:11:59 +0800</pubDate><description><![CDATA[前端时间有个项目遇到从远程的ftp服务器下载文件，是利用的jsch框架实现的,现对相关功能做一下总结。]]></description><category></category></item><item><title><![CDATA[讲个故事：关于一次接口性能优化的心里路程]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/143019844</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/143019844</guid><author>dhklsl</author><pubDate>Thu, 17 Oct 2024 16:44:40 +0800</pubDate><description><![CDATA[这是一个程序猿写的第一个故事，请各位懂行的客官静下心来，慢慢品读。就知道我为什么要单独写一个文章来记录这次过程了，因为实在是太坎坷了......]]></description><category></category></item><item><title><![CDATA[关于oracle数据库/加载机密码中含有特殊字符@:＞＜等的解决办法]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/142986396</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/142986396</guid><author>dhklsl</author><pubDate>Wed, 16 Oct 2024 19:42:18 +0800</pubDate><description><![CDATA[oracle数据库密码含有特殊字符]]></description><category></category></item><item><title><![CDATA[判断http链接中文件是否存在]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/141313855</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/141313855</guid><author>dhklsl</author><pubDate>Mon, 19 Aug 2024 10:12:45 +0800</pubDate><description><![CDATA[最近项目遇到需要从http请求下载文件到服务器，下载前需要判断下http中的文件是否存在。如果判断本地服务器上文件是否存在，用file.exists来判断。但是这个方法却无法判断http中文件是否存在。如果对方系统需要身份验证，那么需要加如下代码。我们系统是需要token验证。]]></description><category></category></item><item><title><![CDATA[File类常用构造方法及方法详解]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/140210982</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/140210982</guid><author>dhklsl</author><pubDate>Fri, 05 Jul 2024 16:05:13 +0800</pubDate><description><![CDATA[File类是对文件或者目录的一系列操作。如文件和目录的创建、检查、删除、路径获取等。现介绍下常用构造方法和方法。File类提供了多个构造方法来创建File对象，以表示文件或目录。]]></description><category></category></item><item><title><![CDATA[关于StringTokenizer使用详解]]></title><link>https://blog.youkuaiyun.com/dhklsl/article/details/140035575</link><guid>https://blog.youkuaiyun.com/dhklsl/article/details/140035575</guid><author>dhklsl</author><pubDate>Fri, 28 Jun 2024 10:37:00 +0800</pubDate><description><![CDATA[近日在项目中遇到一个使用StringTokenizer进行字符串分割的操作，以前按一定分隔符分割字符串都是用String[] result = string.split("分隔符"），然后遍历result得到逐个分割后的元素。现在把这个类的方法研究下。java默认的分隔符是“空格”、“制表符(‘\t’)”、“换行符(‘\n’)”、“回车符(‘\r’)”。：构造一个用来解析str的StringTokenizer对象，并提供一个指定的分隔符，同时，返回分指定的分隔符。：返回从当前位置到下一个分隔符的字符串。]]></description><category></category></item></channel></rss>