问题由来 在easyswoole的群里,每天都需要回答各种各样的问题,其中不乏一些问题反复被小白们问起,比如今天的这个主题:连接池取出empty 为null导致的问题 本文会简单引申出什么是连接池、连接池数量如何设置 (我们电脑能一边听歌一边聊天等等) 我们把一个池中的连接看成一个进程(在实际中也可能是线程级别),如果设置过多,就会在系统中创建太多进程,切换进程上下文就会比较慢了。 一般我们把连接池数量设置为CPU的1~2倍即可(非固定) easyswoole中为什么会pool empty 这个问题有好几个可能性。 此时一直连接失败,也就没有产生资源,也没有将资源放在池内 当你在后续程序获取池内资源的时候。自然就报了空池的错误提示。 程序问题 先来一个连接池的伪代码 <? ); $db->rawQuery('select version()'); // 执行好mysql了 做其他任务 // 耗时1.5s 完成其他 实际上使用到mysql资源的可能只有
EasyCVR视频融合云服务支持海量视频汇聚管理,能兼容多类型的设备接入,平台可对前端接入设备进行统一管理,并能支持采用设备树对设备进行分组、分级、用户与角色权限管理,可支持设备状态监测、云端运维等功能 ,实现对海量接入资源的集中控制与权限分配。 有用户反馈,在使用EasyCVR时,点击左侧的分组列表,出现了分组为空的通道(如图),请求我们排查和协助解决。技术人员立即对该反馈进行了排查分析。 技术人员在排查中经过测试发现,当删除通道时,已分配到分组中的通道,就会出现分组下有通道,但是无名称的情况(为空)。查看数据库,分组关联的设备列表没有将关联的数据删除。 当前端获取时,会去检索对应的通道,但是对应的通道已经被删除,于是就会返回无名称的通道。在项目中加入如下函数,每次删除通道时,都同步调用一次删除关联表的操作,即可解决以上问题。
领8888元新春采购礼包,抢爆款2核2G云服务器95元/年起,个人开发者加享折上折
大家遇到的一个常见错误是,当自动装配一个类,尝试调用该类的方法时,发现该类的实例为null而导致空指针异常。那么,为什么Spring没有自动注入类呢? 有两个可能的原因: 你手动实例化了一个类 @Controller public class Controller { @GetMapping("/example") public String 好吧,IoC就像是街上的帅小伙子一样,如果你使用的是Spring(自动注入),则需要一直使用它。 因此,如果你忘记注解一个类,则该类将不能自动注入,当你尝试使用它时,将得到一个空的实例,从而导致NullPointerException。 否则,自动注入将导致实例为空: public class MyService { public void doStuff() { } } 这样的是没有问题的: @Service public
accesslog = "log/gunicorn_access.log" errorlog = "log/gunicorn_error.log" 正常来说服务启动并有相应请求后,应该在 log 目录下应该有非空的 但是有时我们会发现这两个文件确实存在,只不过 gunicorn_access.log 是空的,而 gunicorn_error.log 正常。 WHY? 当然这里原因众多,我这里只是提出一种可能的原因和解决方案:Python 的 logging 模块导致的。 简单来说,就是无论使用 fileConfig() 还是 dictConfig(),都会有个默认值为 True 的参数:disable_existing_loggers,这会导致在调用 fileConfig 但是随着 flask 服务真正启动之后,gunicorn 的 logger 就被禁用了,后续新请求也就没能够记录,从而导致 gunicorn_access.log 是空的。
EasyNVR是基于RTSP/Onvif协议的视频平台,支持设备接入、视频直播、录像与存储、检索回看、转码分发等视频能力服务,能将前端接入的视频源,实现转码与处理,并支持多格式的视频流分发,包括RTSP 、RTMP、HTTP-FLV、WS-FLV、HLS、WebRTC等,在安防监控领域有着较为广泛的应用。 图片为了便于用户集成、调用与二次开发,我们也提供了丰富的API接口供用户使用,有需要的用户可以参阅官方接口文档。有用户反馈,在调用获取通道信息时,返回信息中SnapURL为空。 在用户的配置文件中找到snap_loop_interval,根据需求调整数值,保存后将EasyNVR重启。图片重启EasyNVR之后,再次调用接口,此时的SnapURL已经返回了值。
EasyCVR平台基于云边端一体化架构,支持将分散的视频资源统一汇聚与管理,实现对视频资源的处理与分发、直播、录像、回看、存储、智能分析等。 近期我们正在对EasyCVR进行新功能的拓展,比如服务器集群、视频轮巡、H.265转码H.264、电子地图与轨迹跟踪等等,欢迎大家关注我们的更新。 有用户现场反馈,EasyCVR在使用时,出现了通道列表为空的情况,不知道什么原因,请求我们排查协助。技术人员立刻对该情况进行了排查和分析。 原来后端传入的数据虽然传递了分页,但是没有传递通道数据,因此出现了通道列表为空的情况。 参考如下代码进行优化,查询总表的设备数据,然后再查询子表的设备数据,如果子表设备不存在,则将主表数据清除,最后将结果再返回给前端。
Optional 向我们保证我们在 ifPresent lambda 中使用的数据不为空。但是,如果用户或地址为空怎么办?然后, ifPresent 将被静默忽略。 Optional 本身可能会导致开发人员创建更多的 NPE,例如通过使用 Optional.of(nullable)。 因此,出于上述原因,一些团队更喜欢使用空检查。 Null 检查与 Optional 一起用于相同目的 - 为可能为 null 的数据提供验证。另外,Optional 提醒开发者返回值可以为空。 它说我们返回一个可能为空的字符串,并且它没有用 @Nullable 注释标记。 但是,代价是什么?现在我们有义务通过@Nullable 方法标记所有可能为Nullable 的方法。这似乎是一个强制性的步骤,我们无法避免。但是,这不是唯一的限制。
于是,当从异常日志准备分析异常原因的时候,只能猜,猜到底为 null 的是谁! 另外,NullReferenceException 异常发生的地方一定不是真正出错的地方! 靠以上两点,当发生异常时,我们能唯一确定 _value 为 null 的原因,而这才是本质错误。 可是,如果并不是参数问题导致了 null,那我们还能用什么异常呢? 当程序此时此刻的状态让我们获取不到某个数据致使数据为 null 时,可以写一个新的提示语告知此时到底是什么样的状态错误才使得获取到的数据为 null。 如果你无法根据现有状态完成方法承诺的任务,请抛出具体的异常并给出真实的原因。 如果确实要用 null 在程序中代表某种状态,请确定这能够代表某种唯一确定的状态,并强制要求使用方判空。 C# 8.0 极有可能为我们带来“可空引用类型”或者“非空引用类型”;如果真的带来了,这将比 JetBrains.Annotations 拥有更大的强制性,帮助我们避免出现意外的 null 引用,帮助我们在可能为
了解异常类的类型后,我们可能会 回答下一个问题:情况有多糟糕以及问题的原因是什么。如何解决问题。我们需要重启JVM吗?我们需要重写代码吗?知道异常类,我们可以预测可能出错的地方。 考虑潜在的原因,我们可以假设问题的原因是什么以及如何解决它。让我们回顾一下最流行的场景,看看这些异常可以告诉我们什么。在接下来的段落中,我们将回顾著名的异常并调查潜在的代码是什么。 让我们来看看最流行的 Java 错误: 潜在原因原因的可能性有多大怎么修需要重写代码吗?需要重启JVM吗? 提供的例外可能是彼此的父级,但是,在这里,我只列出最流行的案例,而不管它们的关系如何: 潜在原因原因的可能性有多大怎么修需要重写代码吗?需要重启吗? 空指针异常预期的不可为空的对象为空高的调用前添加验证层是的是的某些资源不可用并返回空数据中等的调用前添加验证层是的是的并发修改异常迭代期间集合已更改高的分别进行集合迭代和修改是的是的集合在迭代期间已从另一个线程更改高的为集合添加同步是的是的非法参数异常传递的参数无效高的在传递参数之前添加验证是的是的数字格式异常传递的参数格式错误或符号错误高的在传递数据之前添加格式或删除不可见符号是的是的
hang状态,并且影响其他session对该表的操作,为什么耗时这样久,原因就是这个操作需要更新表中所有记录该字段为默认值,另外,还会因为数据量的增加,可能需要更多的UNDO空间,进而可能因为一条新增字段的操作 ,则需要表为空。 表定义中此字段为DEFAULT ‘’ NOT NULL,事实证明(2)是正确的,之所以有(1)的结论,原因是CBO太智能了。 原因就是前面介绍过的11g新特性,新增一个有默认值的NOT NULL约束的字段,默认值不会像以前一样,插入每条记录中,而是会存储于数据字典表,Oracle允许NOT NULL列默认值为NULL,因此对于 name做UPDATE设置为默认值的操作,由于有非空约束,因此不允许。
今天就跟大家一起来学习下空结构体的应用以及底层原理。 01 什么空结构体 首先来看看空结构体是什么。空结构体也是结构体类型,具有结构体的一切特性。但该结构体中没有任何字段组合。 那空结构体类型变量的地址是什么呢? 与channel组合使用,实现一个信号 基于map实现集合功能就是我们开头提到的。使用空结构体不占用存储空间外,还有一个语义上的原因。 那么当阅读或review代码的时候,很有可能带来疑惑,对于值所表达的意图就有所怀疑,增加了理解代码的难度。就会理解成当值为true时会执行一个分支,当值为false时会执行另一段逻辑。 而相比使用一个空结构体strcut{}理解起来会更容易,一看空结构体struct{}就知道要表达的意思是不需要关心值是什么,只需要关心键值即可。 我们再来看下和channel组合使用的例子。
在程序中打错误日志的主要目标是为更好地排查问题和解决问题提供重要线索和指导。 原因六:空指针异常。空指针异常通常是对象没有正确初始化, 或者使用对象之前没有对对象是否非空做检测。 改进措施:对于配置对象, 检测其是否成功初始化;对于普通对象, 获取到实体对象使用之前, 检测是否非空。 原因七:网络通信错误。网络通信错误通常是因为网络延迟、阻塞或不通导致的错误。 最理想的错误日志应该让人在第一直觉下能够知道是什么原因导致,该怎么去解决,而不是还要通过若干步骤去查找真正的原因。 将已有经验集成直接到系统中。 错误日志是排查问题的重要手段之一。当我们编程实现一项功能时, 通常会考虑可能发生的各种错误及相应原因: 要排查出相应的原因, 就需要一些关键描述来定位原因。
缓存穿透将导致不存在的数据每次请求都要到存储层去查询,失去了缓存保护后端存储的意义。 缓存穿透可能会使后端存储负载加大,如果发现大量存储层空命中,可能就是出现了缓存穿透问题。 缓存穿透可能有两种原因: 自身业务代码问题 恶意攻击,爬虫造成空命中 我们来看看如何解决。 缓存层和存储层的数据会有一段时间窗口的不一致,可能会对业务有一定影响。 例如过期时间设置为5分钟,如果此时存储层添加了这个数据,那此段时间就会出现缓存层和存储层数据的不一致。 那布隆过滤器是什么玩意儿?查找它会不会很慢? 布隆过滤器是什么? 不知道你对哈希表了解多少,布隆过滤器是一个类似的东西。 它是一个连续的数据结构,每个存储位存储都是一个bit,即0或者1, 来标识数据是否存在。 存储数据的时时候,使用K个不同的哈希函数将这个变量映射为bit列表的的K个点,把它们置为1。
这里只是针对GO语言的反射来描述,反射主要用在下面两种情况下: 场景一: 参数的入参是空的interface,也就是说参数的入参需要在该函数被执行的时候,才能知道这个入参到底是什么类型。 这种情况产生的原因: 往往是函数定义的时候,希望该入参可以支持很多的数据类型,或者说定义该函数的时候,并没有想好这个入参应该是什么数据类型。 例如: json的序列化操作。 2.反射使用后,会避过了编译阶段的类型检查,导致原本有可能在编译阶段发现的问题被隐藏掉。 3.反射对性能影响还是比较大的,比正常代码运行速度慢一到两个数量级,如果系统对性能要求很高,就需要慎用反射。 备注:GetName()原本只是一个返回值,但是输出结果却是[Hello]数组的原因是,Value.Call()函数的返回值是一个[]reflect.Value的数组。 反射的实现是以空接口作为基础的,可以说空的接口是反射实现的基石。空接口类似于C语言中的void*,它可以转换成任何类型的数值。
对于大型IT系统,最怕的事情第一是系统出现了异常我不知道,等问题闹大了用户投诉了才知道出问题了。第二就是出了问题之后无法找到出错原因。针对这2个问题,说说我们项目组是怎么样规定异常处理的。 空判断大部分时候不需要,你如果写了空判断,你就必须测试为空和不为空二种场景,要么就不要写空判断。 强调,有些空判断是要的,如:参数是用户输入的情况下。 少加空判断,加了空判断就要测试为空的场景! 这篇文章,我估计一定有很多争议,这些规则都和常见的认识相反,我在公司里面推广和写贴分享的时候也有人反对。 但是,你要知道你遇到的是什么问题,要解决的是什么问题? 我遇到是很多异常本来很简单,但由于一堆健壮的try-catch和空判断,导致问题发现很晚,可能很小一个问题最后变成了一个大事件,在一些IT系统里面,尤其常见。
比如贪官,哪怕家里藏满了钱,也要继续贪,因为他上面的需求是空的。 工作干不好的原因:1、缺乏自我认知。2、没有自我责任。 一、目标。Goal 常用问题:你要实现什么目标。具体的目标?具体的指标? 准确清晰的的问出他的目标就可以了。 二、现状。Reality 那么现状是什么?你如何知道这是事实?你如何知道这是准确的信息?这是什么时候发生的?发生的频率如何?那些事让你特别心烦? 他们分别持什么样的态度?是什么原因阻止你不能实现目标?跟你有关系的原因有哪些?在目标不能实现的时候,你有什么感觉? 比如说抱怨。你去说听起来是指责,对方会不接受,但对方自己说就能清晰的了解自己。 在相似或者相同的情况下,你听过别人用什么方法来解决这个问题吗?那如果这样做的话,结果是什么?哪一种选择你认为是最有可能成功的?这些选择的优缺点是什么?请陈述你采取行动的可能性,1到10分,你的打分是? 如果调整哪个指标,可以提高行动的可能性? 还有吗?思维都有惰性。延伸一下。 最难的辅导,是辅导自己特别懂的东西。从辅导变成介入。对方会直接记,变成我要求他作出变化,而不是他自己想要的。
这是什么意思呢?接下来,我们就一个个地来看看。 对于count(主键id)来说,InnoDB引擎会遍历整张表,把每一行的id值都取出来,返回给server层。 server层拿到id后,判断是不可能为空的,就按行累加。 对于count(1)来说,InnoDB引擎遍历整张表,但不取值。 server层对于返回的每一行,放一个数字“1”进去,判断是不可能为空的,按行累加。 单看这两个用法的差别的话,你能对比出来,count(1)执行得要比count(主键id)快。 对于count(字段)来说: 如果这个“字段”是定义为not null的话,一行行地从记录里面读出这个字段,判断不能为null,按行累加; 如果这个“字段”定义允许为null,那么执行的时候,判断到有可能是 其实,把计数放在Redis里面,不能够保证计数和MySQL表里的数据精确一致的原因,是这两个不同的存储构成的系统,不支持分布式事务,无法拿到精确一致的视图。
引子: >>> print '' or 5 or 0 5 >>> print 5 and 4 4 >>> print '' or 5 or 0 and 4 5 出现以上情况的原因是什么呢? 例如 (‘’ or 5 or 0)==(False or True or False),当遇到第一个True的时候,表达式的值等于True这个变量(5)的值,并且不会再去管后面是什么,所以返回5. 1 x或y. x为真就是x, x为假就是y 第三, x and y 的值只可能是x或y. x为真就是y, x为假就是x 显然, 对于, 1 or 5 and 4: 先算5 and 4, 5为真, 值为4. 如果是一真一假,返回真值表达式的值 如果两个都是假,比如空值和0,返回的是右边的值。 (空值或0) 总结一句话就是:无论操作符是哪个,最后的结果一定是按照计算顺序能最快判断出结果的那个表达式决定的 举例: ?
腾讯云短信(SMS)旨在帮助广大企业级用户快速灵活地接入国内外高质量文本短信服务,支持发送验证码、通知类短信和营销短信,通过 SDK/API 和控制台群发短信以及查看多维度短信发送详情和可视化数据分析。
扫码关注腾讯云开发者
领取腾讯云代金券