首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

很开心,使用mybatis过程踩到一个坑。

这是why技术第14篇原创文章 实际开发过程踩到了mybatis一个坑,觉得值得记录、分享一下。 先说说这个坑是什么吧。...org.apache.ibatis.logging.jdbc.BaseJdbcLogger143行,debug方法打印了日志,这行日志就是突破口。...是的,无脑使用了CV大法。导致欢声笑语写出了bug。orderStatus传入类型是一个Byte,和""做判断有任何意义吗?...最后说几句 解决这个问题之后,还是在网上查了一圈,发现也有人遇到了这样问题,但是点开搜索出来第一篇就是一个错误描述,他说mybatis中会把0当做null来处理?哥们你看源码了吗?...之前《面试了15位来自211/985院校2020届研究生之后思考》这篇文章写到一段话,用在这里也很合适: ?

1.6K10

很开心,使用mybatis过程踩到一个坑。

实际开发过程踩到了mybatis一个坑,觉得值得记录、分享一下。 先说说这个坑是什么吧。如果你踩过这个坑,并且知道具体原因,那这篇文章可以加深你印象。...org.apache.ibatis.logging.jdbc.BaseJdbcLogger143行,debug方法打印了日志,这行日志就是突破口。...是的,无脑使用了CV大法。导致欢声笑语写出了bug。orderStatus传入类型是一个Byte,和""做判断有任何意义吗?...最后说一句 解决这个问题之后,还是在网上查了一圈,发现也有人遇到了这样问题,但是点开搜索出来第一篇就是一个错误描述,他说mybatis中会把0当做null来处理?哥们你看源码了吗?...之前《面试了15位来自211/985院校2020届研究生之后思考》这篇文章写到一段话,用在这里也很合适: ?

1K10
您找到你想要的搜索结果了吗?
是的
没有找到

线程必考生产者 - 消费者」模型,看乔戈里这篇文章就够了

这里是《壹齐学多线程》系列第 3 篇 生产者 - 消费者模型 Producer-consumer problem 是一个非常经典线程并发协作模型,分布式系统里非常常见。...问题背景 简单来说,这个模型是由两类线程构成: 生产者线程:“生产”产品,并把产品放到一个队列里; 消费者线程:“消费”产品。 队列:数据缓存区。 ?... Q2 里,其实只有一个线程,因为这里我们必须要加锁才能进行操作。 实现 这里首先建了一个简单 Product 类,用来表示生产和消费产品,大家可以自行添加更多 fields。...总结:使用线程等待通知机制时,一般都要在 while 循环中调用 wait() 方法。 消费者线程是完全对称,我们来看代码。...小结 生产者 - 消费者问题是面试中经常会遇到题目,本文首先讲了该模型三大优点:解藕,异步,平衡速度差异,然后讲解了等待/通知消息机制以及该模型应用,最后进行了代码实现。

49520

Celery 框架学习笔记

生产者消费者模式 实际软件开发过程,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处模块是广义,可以是类、函数、线程、进程等)。...如果让生产者直接调用消费者某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者代码发生变化,可能会影响到生产者。...生产者直接调用消费者某个方法,还有另一个弊端。由于函数调用是同步(或者叫阻塞),消费者方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。...比较喜欢一点是:Celery支持使用任务队列方式分布机器、进程、线程上执行任务调度。然后接着去理解什么是任务队列。 任务队列 任务队列是一种在线程或机器间分发任务机制。...因为涉及到消息中间件,所以我先去选择一个工作要用到消息中间件(Celery帮助文档称呼为中间人),为了更好去理解文档例子,安装了两个中间件,一个是RabbitMQ,一个

63820

celery框架学习

生产者消费者模式 实际软件开发过程,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处模块是广义,可以是类、函数、线程、进程等)。...如果让生产者直接调用消费者某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者代码发生变化,可能会影响到生产者。...生产者直接调用消费者某个方法,还有另一个弊端。由于函数调用是同步(或者叫阻塞),消费者方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。...比较喜欢一点是:Celery支持使用任务队列方式分布机器、进程、线程上执行任务调度。然后接着去理解什么是任务队列。 任务队列 任务队列是一种在线程或机器间分发任务机制。...因为涉及到消息中间件,所以我先去选择一个工作要用到消息中间件(Celery帮助文档称呼为中间人),为了更好去理解文档例子,安装了两个中间件,一个是RabbitMQ,一个

1.1K30

一个故事讲完进程、线程和协程

于是,一个进程至少有一个执行流程(主线程),也可以开启新执行流程(线程)。 线程变成了最小调度单位。...协程 这一天,旺财被一个叫做生产者消费者问题折腾地死去活来,两个线程一个线程向队列中放数据,另外一个从队列取数据,处理起两个线程协作就显得很麻烦,不但需要加锁,还得做好线程通知和等待。...正在感慨多线程编程之难时候, 旺财震惊地发现,小强用了一个极为简单办法把生产者消费者问题给解决了。...“正是这样,” 小强得意地说:“打算把类似生产者消费者这样代码称为‘协程’, 这个协程有个重要特点,就是完全被我所调度和掌控, 不用操作系统介入。” “这个协程和线程似乎很像啊。...对了,也许你注意到了,这两个协程是'合作式',它们两个同一时刻只能有一个在运行。 实际上,底层可以用一个线程去执行这两个协程。

58630

python生产者消费者模型,看这篇就够了

壹 首先先来解释下,什么是「生产者消费者模型」:生产者消费者问题(Producer-consumer problem),也称有限缓冲问题(Bounded-buffer problem),是一个线程同步问题经典案例...该问题描述了共享固定大小缓冲区两个线程——即所谓生产者”和“消费者”——实际运行时会发生问题。生产者主要作用是生成一定量数据放到缓冲区,然后重复此过程。...与此同时,消费者缓冲区消耗这些数据。该问题关键就是要保证生产者不会在缓冲区满时加入数据,消费者也不会在缓冲区中空时消耗数据。...以上是wiki百科对于模型解释,用的话总结一下就是:一个愿打,一个愿挨。 ? 从上图中可以看到生产者消费者之间用中间类似一个队列一样东西串起来。...,我们就可以把仓库货物想像成是一个url,生产者产生url链接,消费者获取url连接并从中得到数据,队列帮助下可以使用多线程加快爬虫速度。

9.1K60

Java多线程系列——线程间通信

2、等待通知机制实现: wait()方法: 方法wait()作用是使当前执行代码线程进行等待,wait()方法是Object类方法,该方法用来将当前线程置入“预执行队列”,并且wait所在代码行处停止执行...set值是1575270909669_589770446724800 此实例生产者生产一个产品,消费者消费一个产品,代码中就是对ValueObjectvalue值进行操作 (2)多生产与多消费...; System.out.println("想当threadTest对象执行完毕后执行"); System.out.println("但是上面代码sleep()值应该写多少呢");...System.out.println("答案是:根据不能确定"); } } 运行结果: 想当threadTest对象执行完毕后执行 但是上面代码sleep()值应该写多少呢 答案是:...想当threadTest对象执行完毕后执行,做到了 方法join作用是使所属线程对象x正常执行run()方法任务,而使当前线程z进行无限期阻塞,等待线程x销毁后再继续执行线程z后面的代码

71230

专为实时而构建:使用Apache Kafka进行大数据消息传递,第1部分

服务器后台线程检查并删除七天或更早消息。只要消息服务器上,消费者就可以访问消息。它可以多次读取消息,甚至可以按收到相反顺序读取消息。...消费者代码生产者代码非常相似。我们首先创建一个对象java.util.Properties,设置其特定于消费者属性,然后使用它来创建一个新对象KafkaConsumer。...将清单2消费者代码分为两部分来确保Consumer退出之前关闭对象。...将依次描述每个类。首先,ConsumerThread是一个内部类,它将topic名称和组名称作为其参数。该类run()方法,它创建一个具有适当属性KafkaConsumer对象。...Consumer类,我们创建一个新对象,并在另一个ConsumerThread线程启动它。ConsumerThead开始一个无限循环,并保持轮询新消息topic。

91130

详细剖析kafka分布式消息系统

一般我们把消息发送者称为生产者,消息接收者称为消费者;注意定义那两个字“异步”,通常生产者生产速度和消费者消费速度是不相等;如果两个程序始终保持同步沟通,那势必会有一方存在空等时间;如果两个程序一持续运行的话...,消费者平均速度一定要大于生产者,不然队列囤积会越来越多;当然,如果消费者没有时效性需求的话,也可以把消息囤积在队列,集中消费。...说到这里,我们再来谈谈队列分类,一般我们根据生产者消费者不同,可以把队列分为三类: 第一类是一个应用程序内部(进程之间或者线程之间),相信大家学多线程时都写过“生产者消费者”程序,生产者负责生产...consumer 1KW:1千万条消息 1K:每个消息1K 先对ActiveMQ单机多Producer、多consumer情况下测试,结果比我想象好,官方给出一个数据是1-2K数据,每秒...结果和预想一样,单机模型下,两者差异不大;而官方给数据说生产者能达到50MB/S,消费者能达到100MB/S,生产者符合官方数据,而消费者始终没有压到那么高速度。

1.8K80

celery学习笔记1

生产者消费者模式 实际软件开发过程,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处模块是广义,可以是类、函数、线程、进程等)。...产生数据模块,就形象地称为生产者;而处理数据模块,就称为消费者。 单单抽象出生产者消费者,还够不上是生产者消费者模式。该模式还需要有一个缓冲区处于生产者消费者之间,作为一个中介。...如果让生产者直接调用消费者某个方法,那么生产者对于消费者就会产生依赖(也就是耦合)。将来如果消费者代码发生变化,可能会影响到生产者。...生产者直接调用消费者某个方法,还有另一个弊端。由于函数调用是同步(或者叫阻塞),消费者方法没有返回之前,生产者只好一直等在那边。万一消费者处理数据很慢,生产者就会白白糟蹋大好时光。...比较喜欢一点是:Celery支持使用任务队列方式分布机器、进程、线程上执行任务调度。然后接着去理解什么是任务队列。 任务队列 任务队列是一种在线程或机器间分发任务机制。

73430

操作系统基础 - 线程级并发

线程 操作系统提供了线程来解决这些问题,一个进程地址空间内实现了多个逻辑控制流(即线程),它们可以像进程一样调度,具体实现上: 每个线程对应一个栈,因此一个使用多线程进程中有多个栈,而不是一个 这些线程共享代码段...下面假设我们要实现一个类似phread线程库,请注意以下代码都是运行在用户态而非内核态。...否则把mutex加入到一个由自旋锁保护等待队列,拥有锁线程释放锁后将等待队列线程唤醒。 关于futex更多详情可以参考linux内核级同步机制--futex....条件变量:同步线程 问题描述 这里就是经典生产者消费者问题,假设我们同时运行n个生产者消费者,它们把任务发布到队列,以及m个消费者线程,从同一个队列获取任务并执行。...我们怎么去协调生产者消费者行为,当队列为空时消费者等待;当队列满时生产者等待。我们需要一个什么样消息机制?互斥锁很明显满足不了需求,代码互斥锁只是用来保护队列

67710

Kafka 压测:3 台廉价服务器竟支撑 200 万 TPS

对于具有数十个或数百个用例多租户设置运行系统尤其如此,其中针对每个用例调优不仅不切实际而且不可能。因此,几乎坚持使用服务器和客户端默认设置。...例如,生产者,我们使用“group commit”类似的机制来确保一个I/O正在进行时发起任何记录被组合在一起。...这种额外延迟似乎会影响我们吞吐量。由于服务器上代码路径非常相似,我们可以通过调整批处理来更好地改善这种影响,并允许客户端缓冲更多未完成请求。 但是,本着避免特殊情况调整原则,没有这么做。...本次测试实际上从日志初始位置开始,因此它在做真正读I/O。但是在生产环境消费者几乎完全从OS页面缓存读取,因为它正在读取刚刚由某个生产者产生数据(这些数据仍然缓存)。...这三个消费者属于同一个消费者成员,即它们消费同样topic。 和我们预期一样,我们看到消费能力线性扩展,几乎就是单个消费者吞吐量3倍,这一点都不令人惊讶。

1K30

mo9 2年java面试总结

面试过程,面试官会根据你回答来不断深入问你,来考察你对知识理解深度。...jdk1.7和jdk1.8hashmap一些变化,1.8版本hashmap会涉及到红黑树。 多线程 如何实现线程安全hashmap? synchronized和lock区别?...怎么停止一个线程,Thread类各个api用法,常用四种线程池有哪些? 生产者消费者有哪些实现方式。...使用wait和notify怎么实现,使用阻塞队列实现生产者消费者,使用lock和condition实现生产者消费者等。 wait和notify为什么必须要在synchronized写呢,实现原理?...数据库 事务隔离级别 事务传播机制 自己线程这块有些欠缺,有些问题不太懂,然后答得也不太好,基本是没戏了。面试完后,得知面试官比我大一届,同时也给我许多建议。

46020

谈谈 Python 生成器

每次执行迭代器next()方法并返回后,该方法上下文环境即消失了,也就是所有next()方法定义局部变量就无法被访问了。...相比多线程,协程好处是它在一个线程内执行,避免线程之间切换带来额外开销,而且多线程中使用共享资源,往往需要加锁,而协程不需要,因为代码执行顺序是你完全可以预见,不存在多个线程同时写某个共享变量而导致出错情况...我们来使用协程写一个生产者消费者例子: def consumer(): last = '' while True: receival = yield last if receival is not...消费者consumer()函数是一个生成器函数,每次执行到yield时即挂起,并返回上一次结果给生产者。...生产者producer()接收到生成器返回,并生成一个值,通过send()方法发送给消费者。至此,我们成功实现了一个(伪)并发。

77760

线程协作机制

Entry Set 阻塞了所有试图获得当前对象锁而失败线程,Wait Set 阻塞了所有获得锁运行期间由于缺失某些条件而交出 CPU 线程集合。...一个典型线程同步问题 下面我们写一个很有意思代码,实现操作系统生产者消费者模型,借助我们 wait 和 notify 方法。...,消费者类随机从仓库一个产品。...刚开始可能是生产者生产一个产品,消费者消费一个产品,而一旦消费者线程执行速度超过了生产者,必然会由于仓库容量为空而被阻塞。...---- 文章所有代码、图片、文件都云存储 GitHub 上: (https://github.com/SingleYam/overview_java) 欢迎关注微信公众号:OneJavaCoder

30030

生产者消费者模式

并发编程中使用生产者消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程工作能力来提高程序整体处理数据速度。...在学习一些设计模式过程,如果先找到这个模式第三者,能帮助我们快速熟悉一个设计模式。 生产者消费者模式实战 和同事一起利用业余时间开发Yuna工具中使用了生产者消费者模式。...1.0版本并没有使用生产者消费模式,而是使用单线程来处理, 因为当时只需要处理我们一个部门邮件,所以单线程明显够用,整个过程是串行执行。...我们一个长连接服务器中使用了这种模式,生产者1负责将所有客户端发送消息存放在阻塞队列1里,消费者1从队列里读消息,然后通过消息ID进行 hash得到N个队列一个,然后根据编号将消息存放在到不同队列里...读者可以平时工作思考下哪些场景可以使用生产者消费者模式,相信这种场景应该非常之多,特别是 需要处理任务时间比较长场景,比如上传附件并处理,用户把文件上传到系统后,系统把文件丢到队列里,然后立刻返回告诉用户上传成功

1.2K10

深入理解阻塞队列

支持阻塞插入方法:意思是当队列满时,队列会阻塞插入元素,直到队列不满 支持阻塞移除方法:意思是队列为空时,获取元素线程会等待队列变为非空 阻塞队列常用于生产者消费者场景,生产者是向队列里添加元素线程...,如果队列为空则阻塞等待 返回头结点,从队列移除头节点,队列没元素会一直阻塞等待,指定时间已经过去还没能拿到头节点,则返回null 检查方法 不可用 不可用 例子 举一个生产者,多消费者例子,...notifyAll()[通知所有阻塞线程]方法,而不是notify()[通知一个阻塞线程]方法,因为有可能出现“生产者”唤醒“生产者”,消费者“唤醒”消费者情况,因此有可能造成死锁,这里以1个消费者...生产者0 生产 生产者0 生产 生产者0 生产 消费者1 消费 消费者1 消费 消费者1 消费 生产者1 生产 把这个实例用阻塞队列来改写,先自己写一个阻塞队列,实现BlockingQueue接口,这里只展示了一部分重写方法...最后说一下LZ理解,个人感觉用ArrayBlockingQueue实现生产者消费者比我上面用synchronized方式应该快很多,毕竟ArrayBlockingQueue只会是生成者通知消费者

22430

求求你,别再用wait和notify了!

以多线程编程经典案例生产者消费者模型为例,我们先来演示一下线程“假死”问题。...1.1 正常版本 在演示线程“假死”问题之前,我们先使用 wait 和 notify 来实现一个简单生产者消费者模型,为了让代码更直观,这里写一个超级简单实现版本。...1.2 线程“假死”版本 当只有一个生产者一个消费者时,wait 和 notify 方法不会有任何问题,然而将生产者增加到两个时就会出现线程“假死”问题了,程序实现代码如下: public class...切记 Lock lock.lock() 方法不能放入 try 代码,如果 lock 方法 try 代码块之内,可能由于其它方法抛出异常,导致 finally 代码, unlock 对未加锁对象解锁...通过以上结果可以看出:当我们调用 notifyAll 时确实不会造成线程“假死”了,但会造成所有的生产者都被唤醒了,但因为待执行任务只有一个,因此被唤醒所有生产者,只有一个会执行正确工作,而另一个则是啥也不干

56550

求求你,别再用wait和notify了!

以多线程编程经典案例生产者消费者模型为例,我们先来演示一下线程“假死”问题。...1.1 正常版本 在演示线程“假死”问题之前,我们先使用 wait 和 notify 来实现一个简单生产者消费者模型,为了让代码更直观,这里写一个超级简单实现版本。...1.2 线程“假死”版本 当只有一个生产者一个消费者时,wait 和 notify 方法不会有任何问题,然而将生产者增加到两个时就会出现线程“假死”问题了,程序实现代码如下: public class...切记 Lock  lock.lock() 方法不能放入 try 代码,如果 lock 方法 try 代码块之内,可能由于其它方法抛出异常,导致 finally 代码, unlock 对未加锁对象解锁...,但因为待执行任务只有一个,因此被唤醒所有生产者,只有一个会执行正确工作,而另一个则是啥也不干,然后又进入等待状态,这就行为对于整个程序来说,无疑是多此一举,只会增加线程调度开销,从而导致整个程序性能下降

36430
领券