<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[felby的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/felby</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; felby]]></copyright><item><title><![CDATA[分库分表？如何做到永不迁移数据和避免热点？]]></title><link>https://blog.youkuaiyun.com/felby/article/details/129297256</link><guid>https://blog.youkuaiyun.com/felby/article/details/129297256</guid><author>felby</author><pubDate>Thu, 02 Mar 2023 11:25:13 +0800</pubDate><description><![CDATA[mysql分库分表]]></description><category></category></item><item><title><![CDATA[Okhttp java.io.EOFException: \n not found: size=0 content= unexpected end...]]></title><link>https://blog.youkuaiyun.com/felby/article/details/128659534</link><guid>https://blog.youkuaiyun.com/felby/article/details/128659534</guid><author>felby</author><pubDate>Thu, 12 Jan 2023 15:13:08 +0800</pubDate><description><![CDATA[Okhttp java.io.EOFException: \n not found: size=0 content= unexpected end...]]></description><category></category></item><item><title><![CDATA[获取客户端真实IP]]></title><link>https://blog.youkuaiyun.com/felby/article/details/128658847</link><guid>https://blog.youkuaiyun.com/felby/article/details/128658847</guid><author>felby</author><pubDate>Thu, 12 Jan 2023 14:17:53 +0800</pubDate><description><![CDATA[但是在客户通过向代理软件就不能获取到客户端的真实IP地址了。经过代理以后，由于在客户端和服务之间增加了中间层，因此服务器无法直接拿到客户端的IP，服务器端应用也无法直接通过转发请求的地址返回给客户端。但是在转发请求的HTTP头信息中，增加了X－FORWARDED－FOR信息用以跟踪原有的客户端IP地址和原来客户端请求的服务器地址。J2EE的SERVLET标准接口javax.servlet.http.HttpServletRequest提供了getRemoteAddr()方法，用来取得来访者的IP地址。]]></description><category></category></item><item><title><![CDATA[CXF导致的JVM MetaSpace OOM问题]]></title><link>https://blog.youkuaiyun.com/felby/article/details/121168454</link><guid>https://blog.youkuaiyun.com/felby/article/details/121168454</guid><author>felby</author><pubDate>Sun, 07 Nov 2021 22:06:24 +0800</pubDate><description><![CDATA[线上CXF版本: 3.1.12
**使用场景：**定时任务，每次任务启动时调用jaxWsDynamicClientFactory.createClient(wsdlUrl)创建客户端client，每次任务结束前调用client.destroy()销毁客户端
**问题：**任务运行一段时间后，metaspace溢出导致服务重启
**分析dump文件：**发现程序创建了大量的URLClassLoader，链式引用，无法回收，最后导致MetaSpace溢出

CXF源码分析：
jaxWsDynamicClient]]></description><category></category></item><item><title><![CDATA[CPU使用率和负载区别及分析]]></title><link>https://blog.youkuaiyun.com/felby/article/details/121076490</link><guid>https://blog.youkuaiyun.com/felby/article/details/121076490</guid><author>felby</author><pubDate>Mon, 01 Nov 2021 11:19:50 +0800</pubDate><description><![CDATA[当我们使用top命令查看系统的资源使用情况时会看到 load average，如下图所示。它表示系统在1、5、15分钟的平均工作负载。那么什么是负载(load)呢？它和CPU的利用率又有什么关系呢？

load average:系统平均负载是CPU的Load，它所包含的信息不是CPU的使用率状况，而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息，也就是CPU使用队列的长度的统计信息。这个数字越小越好。
1. CPU负载和CPU利用率的区别
CPU利用率：显示的是程序在运行期间实时占用的]]></description><category></category></item><item><title><![CDATA[sql分组排序]]></title><link>https://blog.youkuaiyun.com/felby/article/details/121018247</link><guid>https://blog.youkuaiyun.com/felby/article/details/121018247</guid><author>felby</author><pubDate>Thu, 28 Oct 2021 17:00:48 +0800</pubDate><description><![CDATA[对于这样的sql需求：按照某个字段分组排序，选出每组里第一条数据进行展示，可用如下方法达成。

Mysql:


SELECT vin, SUBSTRING_INDEX(GROUP_CONCAT(status ORDER BY update_time desc),',',1),
MAX(update_time) 
FROM tr_party_account_role 
WHERE role_code = 'primary_user' GROUP BY vin;


Oracle,Hive,Impala:

]]></description><category></category></item><item><title><![CDATA[线程池中传递MDC]]></title><link>https://blog.youkuaiyun.com/felby/article/details/115732378</link><guid>https://blog.youkuaiyun.com/felby/article/details/115732378</guid><author>felby</author><pubDate>Thu, 15 Apr 2021 17:35:09 +0800</pubDate><description><![CDATA[线程池中传递MDC
@Bean
public Executor asyncServiceExecutor() {
    logger.info("start asyncServiceExecutor");
    // 使用VisiableThreadPoolTaskExecutor
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    // 配置核心线程数
    executor.setCorePoolSize(]]></description><category></category></item><item><title><![CDATA[logback后缀超过1000的日志文件不删除]]></title><link>https://blog.youkuaiyun.com/felby/article/details/114578603</link><guid>https://blog.youkuaiyun.com/felby/article/details/114578603</guid><author>felby</author><pubDate>Tue, 09 Mar 2021 13:11:40 +0800</pubDate><description><![CDATA[bug描述：

https://jira.qos.ch/browse/LOGBACK-1175



commits:

https://github.com/qos-ch/logback/commit/f264607fb450

但是！！！这个bug在1.3.0-alpha1中才修复，最新的released版本1.2.3中，这个bug依旧存在。logback


]]></description><category></category></item><item><title><![CDATA[HotSpot JVM垃圾回收器总结]]></title><link>https://blog.youkuaiyun.com/felby/article/details/114280314</link><guid>https://blog.youkuaiyun.com/felby/article/details/114280314</guid><author>felby</author><pubDate>Tue, 02 Mar 2021 11:19:20 +0800</pubDate><description><![CDATA[HotSpot虚拟机提供了多种垃圾收集器,每种收集器都有各自的特点,没有最好的垃圾收集器,只有最适合的垃圾收集器.我们可以根据自己实际的应用需求选择最适合的垃圾收集器.

根据新生代和老年代各自的特点,我们应该分别为它们选择不同的收集器,以提升垃圾回收效率.

1 Serial

STW:工作线程全部停止。





单线程

只会使用一个CPU或一条GC线程进行垃圾回收,并且在垃圾回收过程中暂停其他所有的工作线程,从而用户的请求或图形化界面会出现卡顿.

适合Client模式

一般客户端应用...]]></description><category></category></item><item><title><![CDATA[伪共享（false sharing），并发编程无声的性能杀手]]></title><link>https://blog.youkuaiyun.com/felby/article/details/113931650</link><guid>https://blog.youkuaiyun.com/felby/article/details/113931650</guid><author>felby</author><pubDate>Mon, 22 Feb 2021 10:54:10 +0800</pubDate><description><![CDATA[共享（false sharing），并发编程无声的性能杀手

在并发编程过程中，我们大部分的焦点都放在如何控制共享变量的访问控制上（代码层面），但是很少人会关注系统硬件及 JVM 底层相关的影响因素。前段时间学习了一个牛X的高性能异步处理框架 Disruptor，它被誉为“最快的消息框架”，其 LMAX 架构能够在一个线程里每秒处理 6百万 订单！在讲到 Disruptor 为什么这么快时，接触到了一个概念——伪共享( false sharing )，其中提到：缓存行上的写竞争是运行在 SMP 系统中并行线]]></description><category></category></item><item><title><![CDATA[java synchronized锁升级流程]]></title><link>https://blog.youkuaiyun.com/felby/article/details/112596363</link><guid>https://blog.youkuaiyun.com/felby/article/details/112596363</guid><author>felby</author><pubDate>Wed, 13 Jan 2021 22:35:31 +0800</pubDate><description><![CDATA[转载自：https://blog.dreamtobe.cn/2015/11/13/java_synchronized/

]]></description><category></category></item><item><title><![CDATA[深入理解CPU上下文切换]]></title><link>https://blog.youkuaiyun.com/felby/article/details/111186812</link><guid>https://blog.youkuaiyun.com/felby/article/details/111186812</guid><author>felby</author><pubDate>Mon, 14 Dec 2020 22:06:33 +0800</pubDate><description><![CDATA[我们都知道CPU上下文切换，会增加系统负载。那什么是CPU上下文，为什么要切换?
什么是CPU上下文

我们都知道，Linux 是一个多任务操作系统，它支持远大于 CPU 数量的任务同时运行。当然，这些任务实际上并不是真的在同时运行，而是因为系统在很短的时间内，将 CPU 轮流分配给它们，造成多任务同时运行的错觉。
而在每个任务运行前，CPU 都需要知道任务从哪里加载、又从哪里开始运行，也就是说，需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter，PC)。
CPU 寄存器，是]]></description><category></category></item><item><title><![CDATA[[Cloudera][JDBC](10140) Error converting value to long]]></title><link>https://blog.youkuaiyun.com/felby/article/details/109547922</link><guid>https://blog.youkuaiyun.com/felby/article/details/109547922</guid><author>felby</author><pubDate>Sat, 07 Nov 2020 15:45:03 +0800</pubDate><description><![CDATA[使用spark通过impala-jdbc读取kudu表报错：
java.sql.SQLDataException: [Cloudera][JDBC](10140) Error converting value to long.

通过自定义方言解决
	//注册自定义方言
    JdbcDialects.registerDialect(new JdbcDialect() {
      override def canHandle(url: String): Boolean = url.startsWith]]></description><category></category></item><item><title><![CDATA[Mysql char和varchar的区别]]></title><link>https://blog.youkuaiyun.com/felby/article/details/107728158</link><guid>https://blog.youkuaiyun.com/felby/article/details/107728158</guid><author>felby</author><pubDate>Sat, 01 Aug 2020 11:32:24 +0800</pubDate><description><![CDATA[建表语句
CREATE TABLE `bbb` (
  `id` bigint(20) NOT NULL,
  `a` varchar(10) DEFAULT NULL,
  `b` char(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

Insert语句
-- 插入a,b的值均带空格
INSERT INTO `test`.`bbb` (`id`, `a`, `b`) VALUES ('13']]></description><category></category></item><item><title><![CDATA[搜索推荐]]></title><link>https://blog.youkuaiyun.com/felby/article/details/106984346</link><guid>https://blog.youkuaiyun.com/felby/article/details/106984346</guid><author>felby</author><pubDate>Sat, 27 Jun 2020 16:27:09 +0800</pubDate><description><![CDATA[需求：用户每输入一个字都可能会发请求查询搜索框中的搜索推荐。所以搜索推荐的请求量远高于搜索框中的搜索。es针对这种情况提供了suggestion api，并提供的专门的数据结构应对搜索推荐，性能高于match，但它应用起来也有局限性，就是只能做前缀匹配。再结合pinyin分词器可以做到输入拼音字母就提示中文。如果想做非前缀匹配，可以考虑Ngram。不过Ngram有些复杂，需要开发者自定义分析器。比如有个网址www.baidu.com，用户可能记不清具体网址了，只记得网址中有du，此时用户输入du两个字母也是]]></description><category></category></item><item><title><![CDATA[网络编程释疑之：同步，异步，阻塞，非阻塞]]></title><link>https://blog.youkuaiyun.com/felby/article/details/106943372</link><guid>https://blog.youkuaiyun.com/felby/article/details/106943372</guid><author>felby</author><pubDate>Wed, 24 Jun 2020 14:37:53 +0800</pubDate><description><![CDATA[一讲到网络编程的I/O模型，总会涉及到这几个概念。问了很多人，没几个能清晰地讲出他们之间的区别联系，甚至在网络上也有很多不同的观点，也不知是中国文字释义的博大精深，还是本来这几个概念就是绕人不倦。今天我也来给大家讲解一下我对这几个概念的理解。
既然网络上众说纷纭，不如找个权威参考一下，这个权威就是《UNIX网络编程：卷一》第六章——I/O复用。书中向我们提及了5种类UNIX下可用的I/O模型：
阻塞式I/O；
非阻塞式I/O；
I/O复用（select，poll，epoll…）；
信号驱动式I/O（SIGI]]></description><category></category></item><item><title><![CDATA[nginx问题排查: upstream prematurely closed connection while reading response header from upstream]]></title><link>https://blog.youkuaiyun.com/felby/article/details/105991223</link><guid>https://blog.youkuaiyun.com/felby/article/details/105991223</guid><author>felby</author><pubDate>Fri, 08 May 2020 11:12:22 +0800</pubDate><description><![CDATA[问题背景
我们这边是一个基于Nginx的API网关（以下标记为A），最近两天有调用方反馈，偶尔会出现502错误，我们从Nginx的error日志里看，就会发现有" upstream prematurely closed connection while reading response header from upstream"这么一条错误日志，翻译过来其实就是上游服务过早的关闭了连接，意思很清楚...]]></description><category></category></item><item><title><![CDATA[Redis单线程为什么这么快]]></title><link>https://blog.youkuaiyun.com/felby/article/details/105909761</link><guid>https://blog.youkuaiyun.com/felby/article/details/105909761</guid><author>felby</author><pubDate>Sun, 03 May 2020 23:17:00 +0800</pubDate><description><![CDATA[1、完全基于内存，绝大部分请求是纯粹的内存操作，非常快速。数据存在内存中，类似于HashMap，HashMap的优势就是查找和操作的时间复杂度都是O(1)；
2、数据结构简单，对数据操作也简单，Redis中的数据结构是专门进行设计的；
3、采用单线程，避免了不必要的上下文切换和竞争条件，也不存在多进程或者多线程导致的切换而消耗 CPU，不用去考虑各种锁的问题，不存在加锁释放锁操作，没有因为可能出现...]]></description><category></category></item><item><title><![CDATA[Connection reset by peer原因分析定位]]></title><link>https://blog.youkuaiyun.com/felby/article/details/105884487</link><guid>https://blog.youkuaiyun.com/felby/article/details/105884487</guid><author>felby</author><pubDate>Fri, 01 May 2020 23:25:40 +0800</pubDate><description><![CDATA[无意中发现了一个巨牛的人工智能教程，忍不住分享一下给大家。教程不仅是零基础，通俗易懂，而且非常风趣幽默，像看小说一样！觉得太牛了，所以分享给大家。点这里可以跳转到教程。
背景

client和server通过websocket协议通信，长连接保活，server前有nginx做反向代理，client和server是多对多关系；
server端定时给client下发任务，client执行任务并将结果上...]]></description><category></category></item><item><title><![CDATA[java排查CPU占用过高]]></title><link>https://blog.youkuaiyun.com/felby/article/details/105725259</link><guid>https://blog.youkuaiyun.com/felby/article/details/105725259</guid><author>felby</author><pubDate>Fri, 24 Apr 2020 10:51:11 +0800</pubDate><description><![CDATA[背景
记得前段时间，同事说他们测试环境的服务器cpu使用率一直处于100%，本地又没有什么接口调用，为什么会这样？cpu使用率居高不下，自然是有某些线程一直占用着cpu资源，那又如何查看占用cpu较高的线程？
排查思路
top -c  //-c表示显示整个命令行，而不只是显示命令名

结果如下：

PID=21900的进程占用CPU高，则查看该进程各个线程的cpu使用情况
top -Hp  219...]]></description><category></category></item></channel></rss>