月度归档:2016年12月

Spring的DataSource是如何工作的

如果你使用过Spring管理过数据库连接,那么一般会在applicationContext.xml文件里看到如下的代码:

这段配置就是用来指定datasource的,其实跟普通的bean注入没什么区别啊,那在这背后Spring到底干了些什么呢?这个bean是如何管理数据库连接的呢?想要理解这背后的一切自然就要看看这个类:org.springframework.jdbc.datasource.DriverManagerDataSource到底干了些什么。

看到这里应该很清楚了,DriverManagerDataSource这个类只不过非常简单地封装了一下JDK的DriverManager,本质上还是使用DriverManager来获取数据库连接。值得注意的是,DriverManagerDataSource最顶层继承了JDK的DataSource,也就是说只要有一个DataSource的实例,然后调用getConnection()即[……]

继续阅读

数据库定时重置的另一种思路

需求:
网页游戏里面经常会有一些功能模块是需要每天重置的,比如每天有5次抽奖次数,每天可以兑换资源的次数等。那么正常的思路必然是在第二天零点的时候对数据库相关表字段进行update。这是很合理的思维方式,在游戏发展初期是不会有什么问题的。但是当服务器玩家数量增加,零点需要重置的表变多时,0点就会出现很多锁超时的错误:ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction导致某些玩家数据库更新失败。那怎么解决呢?

思路:
1.适当地调整MySQL锁超时的时间,默认设置是50S。可以通过设置参数innodb_lock_wait_timeout来调整时间。但是值得注意的是,这个参数不能调得太大,那样的话如果数据库长时间不释放锁会导致程序线程卡死,影响玩家体验。
2.跟策划讨论更改重置时间的可能,把不同的模块尽量错峰执行,比如有些是在0点,有些是在1点,2点等,但这种方式会限制游戏的玩法,不是个好的选择。
3.尽量减少全表更新,比如像这种SQL语句
[crayon-656cae9f1[……]

继续阅读

我在想些什么?

序言
前几天在日本旅行,坐在大巴上听音乐,脑子不自觉地思考了很多问题。摘掉耳机之后恍然觉得有些问题还是蛮有意义的,应该把他们记录下来。不求严谨,不求答案,只是想真实地记录二十几岁的自己每天都在想些什么。高晓松在《鲁豫有约》中讲述了他对四十不惑的理解:原来我以为到了四十岁就什么都懂了,到了四十岁才发现,不惑的意思是你不想明白的事就不想明白了。年轻的时候每件事你都想明白,每个人你都想仔细把他看透。虽然我还远没到四十岁,不能和他感同身受,但是现在的我每天都有很多“惑”想弄明白,与其在脑海中一闪而过,不如认真记录下来。2016/12/5

命中注定
有没有想过一个问题,是不是人这一生中的很多事情都是命中注定的?最近思考的越多越觉得人生不可思议,很多年前的一个小小的梦想,在若干年后居然莫名其妙实现了。可是在这期间我根本就没有去主动追求他,甚至完全把他遗忘了,可是就在某一转折的时间点,某个人,某些事的出现改变了这一切。其实,一个人将来的某一个决定、行为都不是那一刻的你造就的,而是这你之前的所有人生碎片组成的,任何一个时间结点你做了不同的事,结局可能会完全不一样,这就是蝴蝶效应。但是蝴蝶效应[……]

继续阅读