用于远程工作和在线会议的开源视频会议工具
如果根据该文中的分类,Spanner、TiDB、OB 算是第一种新架构型,Sharding-Sphere、Mycat、DRDS 等中间件方案算是第二种(文中还有第三种云数据库,本文暂不详细介绍)。 基于中间件(包括 SDK 和 Proxy 两种形式)+传统关系数据库(分库分表)模式是不是分布式架构? 我觉得是的,因为存储确实也分布式了,也能实现横向扩展。但是不是"伪"分布式数据库?从架构先进性来看,这么说也有一定道理。 "伪"主要体现在中间件层与底层 DB 重复的 SQL 解析与执行计划生成、存储引擎基于 B+Tree 等,这在分布式数据库架构中实际上冗余低效的。
为了避免引起真伪分布式数据库的口水战,本文中 NewSQL 数据库特指这种新架构 NewSQL 数据库。 上也有很多关于中间件+传统关系数据库(分库分表)与 NewSQL 分布式数据库的文章,但有些观点与判断是我觉得是偏激的,脱离环境去评价方案好坏其实有失公允。 本文通过对两种模式关键特性实现原理对比,希望可以尽可能客观、中立的阐明各自真实的优缺点以及适用场景。 NewSQL 数据库先进在哪儿?
首先关于“中间件+关系数据库分库分表”算不算 NewSQL 分布式数据库问题,国外有篇论文 pavlo-newsql-sigmodrec: 我先给大家介绍一下弱引用: 只具有弱引用的对象拥有更短暂的生命周期,在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。 不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。 这就导致了一个问题,ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。 就比如线程池里面的线程,线程都是复用的,那么之前的线程实例处理完之后,出于复用的目的线程依然存活,所以,ThreadLocal设定的value值被持有,导致内存泄露。 按照道理一个线程使用完,ThreadLocalMap是应该要被清空的,但是现在线程被复用了。 那怎么解决? 在代码的最后使用remove就好了,我们只要记得在使用的最后用remove把值清空就好了。
ThreadLocal 我就截取了部分代码,如果线程的inheritThreadLocals变量不为空,比如我们上面的例子,而且父线程的inheritThreadLocals也存在,那么我就把父线程的inheritThreadLocals给当前线程的inheritThreadLocals。 是不是很有意思? 小伙子你懂的确实很多,那你算是一个深度的ThreadLocal用户了,你发现ThreadLocal的问题了么? 你是说内存泄露么? 我丢,这小子为啥知道我要问什么?嗯嗯对的,你说一下。
这个问题确实会存在的,我跟大家说一下为什么,还记得我上面的代码么? (编辑:莆田站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |