面试总结 - 数据库连接池

笔者最近在换工作的时,被面试官问数据库和连接池相关的一些问题。
下面从面试这块开始

简单介绍一下笔者项目中MySQL的使用情况。
项目中使用MySQL做数据存储,Redis做数据缓存。读写数据流程如下:

  1. 读数据:先查询Redis中是否存在,存在直接取出数据,不存在从MySQL查询并保存包Redis中缓存起来。
  2. 写数据:先写入Redis,然后异步提交到MySQL写入线程,实现数据落地。

问题1:如何保证数据读写的“原子性”?如何解决脏数据?

众所周知,当使用数据库跨表操作时,利用数据库引擎提供的事务和回滚机制,可以保证数据库跨表操作的原子性。

一方面在项目中引入数据缓存层也是一种常见的减轻数据库压力的做法。另一方面引入了缓存增加了数据操作的复杂度。

如何解决缓存中和数据库中数据不一致的问题?
笔者以线上项目为例简单的说了说。在线上的代码,主要以缓存层数据为主,数据不统一的情况,会在下一次落地时覆盖数据库的数据,实现同步。
假如是因为版本迭代数据库字段变更导致数据库落地错误时,由于Redis缓存的有效期是7天,在7天内手动执行脚本将数据重新落地。

由于面试官一再强调是自动修复脏数据。
说实话笔者在保证Redis和MySQL两者数据操作的原子性这块。所以也没有什么好的办法。
由于面试官一再询问,笔者就稍微讲了讲一个思路。也许是否可以使用数据库的原子性,回滚的时候回退数据?
当然事实证明一时的想法总是有漏洞的。数据回退涉及到数据回退前多次被修改的复杂情况。显得不是很合适。

最后尴尬的是面试官的结论:(大意如下)
在修改数据前,尽可能多的判定用户是否满足操作的条件,以便于提早发现问题并退出, 以避免数据操作。同时避免异步操作数据库,同步操作及早出现问题并退出。

wtf... 当时一下子感觉自己有点懵逼的。才发现整个就理解错了。瞬间也是好尴尬。

问题2:HikariCP是什么?

HikariCP是一个高性能的JDBC连接池。Hikari是日语“光”的意思。可能是目前java业界最快的数据库连接池(BoneCP因此停止维护,其作者推荐HikariCP)。
面试官说项目用的c3p0作为数据库连接池。还问了何时连接池会关闭数据库的连接。

说实在的,当时笔者没回答好,一般数据库连接池会自动管理数据库连接建立、复用和关闭。一般情况下不会关闭已经建立的数据库连接。
连接池关闭连接方面,其他连接池不清楚,HikariCP会在设置的最大生命周期后,最大空闲时间后等多个条件作用下自动关闭释放连接。

下面是总结

数据库连接池技术

数据库连接池负责分配、管理和释放数据库的连接。

  1. 数据库连接复用。重复使用现有的数据库连接,可以避免连接频繁建立、关闭的开销。
  2. 统一的连接管理。释放空闲时间超过最大空闲时间的数据库连接,避免因为没有释放数据库连接而引起的数据库连接泄漏。

一些数据库连接池的对比

首先明确:无论任何形式的数据库连接复用(数据库连接池技术)都避免了频繁建立、关闭数据库连接带来的开销。性能相对于没有连接池有质的提升。
另外一点需要明确:数据库连接池一般不会成为整个程序的性能瓶颈。更多的出现在数据库读写,带宽,cpu等方面(开始人云亦云模式,o(∩_∩)o 哈哈)。

下面引入正文,先来一个对比。
文章数据库连接池性能比对很早之前看到过,但一直没找到原帖。
皇天不负有心人,今天总算是挖出来了原帖(鄙视一下盗链和转帖不挂源地址的)。

HikariCP

HikariCP可能是目前业内最快的数据库连接池。

说到HikariCP就不得不说BoneCP。笔者之前也是BoneCP的使用者。突然那么一天(忘记具体是哪天了)想看看BoneCP是否有新版本。
然后发现BoneCP作者在项目主页的描述说不再更新BoneCP并且推荐了HikariCP。

笔者也有段时间没关注这个类库了,面试的时候因为也好久没看了,所以讲的也不是很清楚。于是就抽空复习总结一下。
笔者之前在博客园发表过一篇关于HikariCP的文章,简单讲了Spring+Mybatis+HikariCP的配合使用。
那时候刚接触HikariCP,被官方的测试数据所吸引,毕竟BoneCP停产了,而且在代码基本上不需要改动的情况下就能获得更好的性能,何乐而不为呢? 所以决定试试这个“新家伙”

HikariCP的官方Wiki中提到的为什么HikariCP是如何实现这么高效率。详细见:
Down the Rabbit Hole
掉进兔子洞? 反正我是不懂这是什么谚语。o(∩_∩)o 哈哈。
大概内容如下:

  1. 优化字节码(JVM内联),减少生成的机器码
  2. 精简代码, 使用Javassist生成委托。
  3. 无锁容器。FastStatementList、ConcurrentBag
  4. 等等针对BoneCP的优化。(好针对BoneCP啊,o(∩_∩)o 哈哈)

Druid

Druid是阿里巴巴开源的“为监控而生的数据库连接池!”。
性能测试过程略低雨HikariCP,但是提供了强大的监控和扩展功能。支持psCache。

有兴趣可以去GitHub查看。有中文文档。o(∩_∩)o 哈哈。阿里威武

作者:TinyZ 出处:http://www.cnblogs.com/zou90512/ 关于作者:努力学习,天天向上。不断探索学习,提升自身价值。记录经验分享。 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接 如有问题,可以通过 tinyzzh815@gmail.com 联系我,非常感谢。 笔者网店: https://shop70768633.taobao.com/. 欢迎广大读者围观
posted @ 2016-06-04 18:59  Tiny&zzh  阅读(5589)  评论(0编辑  收藏  举报