-- Unsafe query: 'Update' statement without 'where' updates all table rows at once没有任何约束的情况下,当前指定数据表中的所有数据行全部执行修改操作。这很危险!一定要带有where条件约束:update person set id = 10;-- OKupdate person set id = 10 where name = 'java';可以同时修改多个数据,不同的字段赋值操作使用 逗号隔开updat
打开wireshark,主界面如下:选择菜单栏Capture -> Option,勾选网卡。点击Start,启动抓包。
Type handler was null on parameter mapping or property ‘__frch_xxx_0’可知是mapper.xml写错,因为使用foreach语句时,两个foreach标签中间的参数写错了<select id=" get" parameterType="entity" resultMap="java.util.List"> select id, name from t where id in <foreach col
连接池配置连接池提供了许多参数,最重要的就是最大连接数,连接池能使用的连接数达到上限后,新来的请求需要等待其他请求释放连接。最大连接数不是越大越好:过大客户端需耗费过多资源维护连接,且由于服务端对应的是多个客户端,每一个客户端都保持大量连接,会给服务端带来更大压力:不仅是内存压力,若服务端的网络模型是一个TCP连接一个线程,那么几千个连接意味着几千个线程,导致大量线程切换开销过小可能因为获取连接的等待时间太长,导致吞吐量低下,甚至超时无法获取连接模拟压力增大导致数据库连接池打满如何确认连
很多同学写更新缓存时,先删除缓存,然后再更新数据库,而后续操作会把数据再装载到缓存。这个逻辑是错误的。最简单的两个并发操作:更新&查询。更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存,然后更新操作更新了数据库。于是,缓存中的数据还是老数据,导致缓存中的数据是脏的,而且还一直这样脏下去。所以特此总结一下几个缓存更新的Design Pattern。先不讨论更新缓存和更新数据这两个事是一个事务的事,或是会有失败的可能,先假设更新数据库和更新缓存都可以成功的情况。1 Cach
zookeeper Leader 发送了 commit 消息,但是所有的 follower 都没有收到这条消息,Leader 就挂了,后续会怎么处理?看谁成为leader 如果是前一个leader的话视为提交成功
缓存不仅加快了IO,还可减少原始数据的计算工作。缓存系统一般设计简单,功能单一,所以Redis吞吐量能是MySQL几倍~几十倍,对于互联网读多写少的高并发场景已不可或缺。虽然简单好用,但是如果姿势不对,就会造成不必要的损失。不要把Redis当数据库很多人不仅把 redis 当缓存,更是把Redis当做数据库使用。很多因为Redis中数据消失导致业务逻辑错误,并且因为没有保留原始数据,业务都无法恢复。虽然Redis有持久化功能,但这并不能以为它可作为高性能的KV数据库。Redis处理请求很快,但那
确定是内存泄漏还是确实内存不够用。前者则修复问题,后者则增加内存如果没有增加内存的条件,则考虑重构优化,比如原来的进程内缓存改为远程缓存,以减少内存使用如果不能通过简单的手段减少内存使用,则需要做架构层面的重构,将功能拆分成多个服务。是内存溢出还是实际有大对象,内存溢出就dump分析解决掉。大对象如果有业务需求,用offheap....
tostring如果不设置参数的话,打印string的时候只会包含子类的属性需要在@Data的基础上再加一个@ToString(callSuper = true)注解
LocalDate转DateLocalDate nowLocalDate = LocalDate.now();Date date = Date.from(localDate.atStartOfDay( ZoneOffset.ofHours(8)).toInstant());LocalDateTime转DateLocalDateTime localDateTime = LocalDateTime.now();Date date = Date.from(localDateTime.atZon
在mybatis中dao接口与mapper配置文件在做映射绑定的时候出现问题,简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到。xml文件所在package名称是否和Mapper interface所在的包名一致Dao的方法在xml中没有,然后执行Dao的方法Dao的方法返回值是List ,而select元素没有正确配置ResultMap,或只配置ResultType如果你确认没有以上问题,请任意修改下对应的xml文件,比如删除一个空行看下mapper的XML配置路径是否正确
阿里郎,还记得你们公司《手册》中异常处理给出的这些建议吗?2 "吞掉"异常?2.1 简介即,处理后不再将异常传给上层。其中包括 catch 到异常并处理(打印日志、发通知等)后不再扔给上层;捕捉到异常后给上层返回 null 值等行为。前一小节的强制 5就属于该种措施。2.2 为什么要手动回滚先看事务的执行入口:TransactionInterceptor#invokeTransactionAspectSupport#invokeWithinTransaction : @Nulla
Guava 的冲击由于 JDK1.5 Futrure 的 get 方法获取任务结果必须阻塞等待,Google 看不下去了,开发了 Guava 库 public static void main(String[] args) throws Exception { // 装饰器模式 ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(2
如何优化一个询价应用的核心代码?如果采用“ThreadPoolExecutor+Future”的方案,你的优化结果很可能是下面示例代码这样:用三个线程异步执行询价,通过三次调用Future的get()方法获取询价结果,之后将询价结果保存在数据库中。// 创建线程池ExecutorService executor =Executors.newFixedThreadPool(3);// 异步向电商S1询价Future f1 =executor.submit(()->getPriceByS1(
Semaphore,信号量,线程能不能执行,要看信号量是不是允许。下面我们首先介绍信号量模型,之后介绍如何使用信号量,最后我们再用信号量来实现一个限流器。信号量模型信号量模型还是很简单的,可以简单概括为:一个计数器,一个等待队列,三个方法。在信号量模型里,计数器和等待队列对外是透明的,所以只能通过信号量模型提供的三个方法来访问它们,这三个方法分别是:init()、down()和up()。你可以结合下图来形象化地理解。信号量模型图这三个方法详细的语义具体如下所示。init():设置计数器的初始值。
了解读写锁吗?互联网的并发场景大多是读多写少。所以缓存技术使用普遍。JUC也提供了读写锁-ReadWriteLock。那你说说什么是读写锁?读写锁一般遵循以下设计原则:允许多个线程同时读共享变量只允许一个线程写共享变量如果一个写线程正在执行写操作,此时禁止读线程读共享变量。知道读写锁与互斥锁的区别吗?读写锁允许多个线程同时读共享变量,而互斥锁不允许。这也是读多写少时读写锁的优势。读写锁的写是互斥的,当一个线程在写共享变量时,其他线程不允许执行写或读。知道如何使用Read.
最近监控发现对账系统最近越来越慢,领导急了,开始询问我能优化一下性能吗。我深入看了对账系统的业务后,发现还是挺简单的:用户通过在线商城下单,会生成电子订单,保存在订单库之后物流会生成派送单给用户发货,派送单保存在派送单库为了防止漏派送或者重复派送,对账系统每天还会校验是否存在异常订单系统流程图抽象对账系统的代码,也很简单,核心代码如下,就是在一个单线程里面循环查询订单、派送单,然后执行对账,最后将写入差异库。while(存在未对账订单){ // 1.查询未对账订单 pos = ge
读写锁允许多个线程同时读共享变量,适用于读多写少。那在读多写少的场景中,有没有更快的技术方案呢?还真有,JDK在1.8提供StampedLock,其性能比读写锁还好。StampedLock支持哪些锁模式?我们知道ReadWriteLock支持读锁、写锁两种锁模式。而StampedLock支持三种:写锁、悲观读锁和乐观读。其写锁、悲观读锁和ReadWriteLock的写锁、读锁的语义类似。不同在于:StampedLock的写锁和悲观读锁加锁成功后,都会返回一个stamp;释放锁时,需要传入该sta
Web文件浏览器,通过它用户可以在浏览器里查看服务器上的目录和文件。这个项目依赖运维部门提供的文件浏览服务,而这个文件浏览服务只支持MQ接入。在这种接入方式中,发送消息和消费结果这两个操作之间是异步的,你可以参考下面的示意图来理解。MQ示意图用户通过浏览器发过来一个请求,会被转换成一个异步消息发送给MQ,等MQ返回结果后,再将这个结果返回至浏览器。给MQ发送消息的线程是处理Web请求的线程T1,但消费MQ结果的线程并不是线程T1,那线程T1如何等待MQ的返回结果呢?class Message{
多个线程同时读写同一共享变量存在并发问题,这里的必要条件之一是读写,如果只有读,而没有写,不会有并发问题。解决并发问题,其实最简单的办法就是让共享变量只有读操作,而没有写操作。 即不变性(Immutability)模式。就是对象一旦被创建之后,状态就不再发生变化。换句话说,变量一旦被赋值,就不允许修改了(没有写操作);没有修改操作,也就是保持了不变性。快速实现具备不可变性的类将一个类所有的属性都设置成final的,并且只允许存在只读方法,那么这个类基本上就具备不可变性了。更严格的做法是这个类本身也
“多线程版本的if”来理解Guarded Suspension模式,不同于单线程中的if,这个“多线程版本的if”是需要等待的,而且还很执着,必须要等到条件为真。但很显然这个世界,不是所有场景都需要这么执着,有时候我们还需要快速放弃。需要快速放弃的一个最常见的例子是各种编辑器提供的自动保存功能。自动保存功能的实现逻辑一般都是隔一定时间自动执行存盘操作,存盘操作的前提是文件做过修改,如果文件没有执行过修改操作,就需要快速放弃存盘操作。下面的示例代码将自动保存功能代码化了,很显然AutoSaveEditor
根据提示,找到对应文件,直接删除lock文件即可。
JVM源码内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行。JVM内存布局规定了Java在运行过程中内存申请、分配、管理的策略,保证了JVM的高效稳定运行不同的JVM对于内存的划分方式和管理机制存在着部分差异结合JVM虚拟机规范,来探讨经典的JVM内存布局JVM运行时数据区线程独占:每个线程都会有它独立的空间,随线程生命周期而创建和销毁线程共享:所有线程能访问这块内存数据,随虚拟机或者GC而创建和销毁1 Program Counter .
初始化的过程,主要完成的工作是在容器中建立 BeanDefinition 数据映射,并没有看到容器对Bean依赖关系进行注入。假设当前IoC容器已经载入用户定义的Bean信息,依赖注入主要发生在两个阶段正常情况下,由用户第一次向 IoC 容器索要 bean 时触发可在 BeanDefinition 信息中通过控制 lazy-init 属性来让容器完成对Bean的预实例化,即在初始化的过程中就完成某些Bean的依赖注入的过程。+1 getBean触发的依赖注入BeanFactory,最原始的
共同点装配bean写在字段上写在setter方法上@Autowired该注解属Spring,默认按类型装配。可以作用在变量、setter方法、构造器。默认要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,这样当没有找到相应bean的时候,程序不会抛错。@Autowired(required=false) 若想使用名称装配,需要配合@Qualifier一起食用,如下:@Autowired() @Qualifier("baseDao")
1 概念迭代器模式(Iterator Pattern)目前已经是一个没落的模式,基本上没人会单独写一个迭代器,除非是产品性质的开发,其定义如下:Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.(它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节。)迭代器是为容器服务的,那什么是容
如何才能有效避免线程的频繁创建、销毁以及OOM?Java应用最多的就是Worker Thread模式(后文简称为 WT)。如何实现WT?WT类比程序员的工作场景:办公室里的执行 OKR 的程序员们,如果产品需求池有任务了,大家一起分任务,需求池空了(有生之年基本不会空)就摸鱼。画个示意图理解下,WT 中的 Worker Thread对应我们程序员,一个团队的程序员数量往往固定。编程中如何模拟这种模式呢?容易想到用阻塞队列做需求池,然后创建固定数量的线程消费阻塞队列中的任务。这其实就是Ja.
并发编程的核心是什么?同步互斥分工并发编程解决分工问题有哪些设计模式?Thread-Per-Message模式Worker Thread模式生产者-消费者模式…简单说说Thread-Per-Message模式将事情委托他人代办,有个好处,就是可以专心做自己事了。编程也是这样,比如写一个HTTP Server,很显然只能在主线程中接收请求,而不能处理HTTP请求,因为若在主线程中处理HTTP请求,则同一时间只能处理一个请求,太慢了!这时就可以采取委托的思路,创建一个子.
容器运维平台的:镜像仓库解决Docker镜像存储和访问的问题资源调度决定Docker镜像可以分发到哪些机器上这些解决后,就该考虑如何在集群中创建容器,即容器调度。容器创建后如何运作才能对外提供服务,即服务编排。容器调度当服务需要发布的时候,该选择哪些机器部署容器。若集群机器规模上百台,要发布的服务上百个,就不能靠人肉运维,需要有专门容器调度系统,所以很多基于Docker的容器调度系统,比如Swarm、Mesos。Kubernetes。它们能解决哪些问题呢?主机过滤解决容器创建时什
一般有两种方式可以给一个类或对象增加行为:继承通过继承一个现有类,可以使得子类在拥有自身方法同时还拥有父类方法。但这种方法是静态的,用户无法控制增加行为的方式和时机。关联将一个类的对象嵌入另一个对象中,由另一个对象决定是否调用嵌入对象的行为以便扩展自己的行为,这个嵌入的对象就叫做装饰器(Decorator)产生原因装饰模式以对用户透明的方式动态地给一个对象附加上更多功能。用户不会觉得对象在装饰前和装饰后有何不同。装饰模式可以在不需要创造更多子类情况下,扩展对象功能。定义对象结构型模式。
Copyright © 2005-2025 51CTO.COM 版权所有 京ICP证060544号