能尽量用数据库代替内存就用吧,减少整天担心内存问题

游戏不好搞啊,设计的东西,能尽量简单就简单,代码太多判断就写死行了,反正它运行起来是对的就行了。

情形:09:00

昨天发生了很痛苦的一件事情,那就是游戏中data内存同步不到data数据库,这个问题在第二天才发现(游戏还可以正常玩),这让人很担心啊。同步data内存的是一个定时器TaskTimer,这个定时器会定时回写数据到data库中,但在某个时间点后就发现数据库没有增,一直停留停在那个点上;看到这个问题时,游戏肯定是不允许kill掉重启的(部分玩家数据会没有,会回档)。

确认问题:18:00

一开始时,就以为是后台操作不对,或配置有问题会导致data同步TaskTimer停掉,但开服后过一段时间才是这样,TaskTimer停掉的时候管理员也没有做不当的操作,所以查找操作日志是否恰当,查找配置是否有问题,查找数据库的密码是否被改过,查找代码是否有问题等,排除了外部的问题后,觉得是底层代码有问题,于是看了同步内存的代码,逻辑上是没有什么问题的,以前也没有出现过这种问题(开过好多个服),也是只之前的运气好,呵呵,其中发现在save(保存)操作时是没有try catch是,如果save有超时,过多操作等问题这里可能会报错。其中save方法里没有throw Error,但我们还是相信是这里出了问题。

想出解决办法:21:00

随着玩家数的增加,充值的增加,也意味着要快点解决问题,或则没有办法同步数据则丢失数据更严重。于是查看了游戏重启接口,这里是当游戏停服时,会停掉外网玩家的请求,将内存数据立即写入数据库,完成后会调用sh脚本kill me 再启动游戏。但同步内存代码和重启同步是同一个方法(同一个代码),痛苦啊。。。。定时器挂掉也是这段代码,虽然我们觉得是save有报错而停掉,如果不是,重启还是一样保存不了,那更惨。。。又认真研究这些代码,save报错的可能性最大,第二可能性是数据库操作对象无郊了,于是将目光转移到数据库操作对象这里,这个对象重启时会不会有问题呢?后来发现在重启时,是new 一个同步对象出来的,同步把新的数据库连接对象放入进去(很好的设计)。 于是我们就不担心数据库操作对象的问题了,这是方案一;如果方案一失败后,就直接导致无法恢复,这也是不允许的(除非逼不得已),于是有了方案二(备用方案,将损失降到最低),该方案是模拟现在所有的玩家,去登录外网服,然后请求能用于用户数据恢复的接口,将获得的数据,再一步步解析出来,用这些数据去还原一个玩家的重要数据,这也就相当于做前端了,比如:获得用户的等级level,则记录下来,再自己去new 一个User到自己数据库保存好。方案二也是逼不得已的,方案二的可行性及实现性很低,完全恢复也不是可能的,数据大多,并且工作量巨大。但不能丢掉数据,唉,方案一一旦执行后,则无法执行方案二,所以只能去试试方案二了。

实现方案:00:00

一开始方案二无从下手,要获得一个完整的玩家数据,则要从多个接口去获得,并且写的时候还不能直接去测试(会对外网玩家有很大的影响),只能将备份外网的数据库过来测。这些数据是正确的,但data库中(有三个库)数据不全(在内存中),这三个库如果是正常测试的话,数据是要一一对应的。所以蛋痛啊。。。。这叫我怎么去写代码拿数据,几个小时后还是没有办法写出代码来,估计是一辈子要写最凄凉的代码了。。。

最终执行:04:50

方案二明显是不可能做到的,于是放弃了,也是没有办法的了,所以将目光转向到方案一,方案一是重启,但又不想让程序停掉,所以我们将kill的脚本给删除了,到时重启时程序无法找到脚本从而无法重启,这时我们又可以多测试几次执行将内存同步数据库的代码,这恐怖的代码,让我们还是不放心,于是就在内网做定时器的异常报错,重启时再跑那些代码,内网测试是能同步内存的。所以现在将内存同步代码try catch 多写个可以控制游戏内存同步数据库的代替接口,将该版本更新到外网(重启后生效)。

最终结果:5:30

成功!再进入游戏测试,结果数据都同步到了数据。。。这天都不知道死了多少脑细胞。。。。。

【总结】

1、如标题:能尽量用数据库代替内存就用吧,减少整天担心内存问题—-内存确实是能带来读取数据的方便与快,但管理内存却是一件很头痛的事情,也很容易失去数据,所以效率允许的情况下,你还是改用数据库吧,毕竟–安全,稳定之后 才是效率

2、多写容错结构,像重启时执行代码对象里,是重新分配一个新的数据库操作对象过来,如是还是用旧的那个,之前别的地方用它挂掉了,那其他重要的执行则无法执行了。

3、相信自己的眼光,不要过多的猜想,运行好久的底层代码也是不可靠的

Original: https://www.cnblogs.com/hellohuang/archive/2013/04/20/3032255.html
Author: HolleHuang
Title: 能尽量用数据库代替内存就用吧,减少整天担心内存问题

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/612800/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式之(4)——单例模式

    定义:单例模式属于创建型模式,该类负责创建自己的对象实例,并且确保只有单个对象被创建,同时该类提供了一种全局访问其唯一实例对象的方式;这个定义中有三个要点:1、单例类只能有一个实例…

    数据库 2023年6月14日
    091
  • bbs项目前期准备和表设计

    一、前期准备 1.新建一个django项目 2….

    数据库 2023年6月14日
    083
  • English words1004

    本文来自博客园,作者:ukyo–BlackJesus,转载请注明原文链接:https://www.cnblogs.com/ukzq/p/16754120.html Or…

    数据库 2023年6月11日
    085
  • spring-boot-starter-actuator

    使用: HTTP方法 路径 描述 鉴权 GET /autoconfig 查看自动配置的使用情况 true GET /configprops 查看配置属性,包括默认配置 true G…

    数据库 2023年6月16日
    094
  • mysql开启二进制日志

    打开xhell进入系统 进入mysql配置文件目录 执行 cd /etc/mysql 首先找到my.cnf这个配置文件,然后使用vim进入文件编辑 放开我标记的地方。 注意我标记的…

    数据库 2023年6月6日
    0125
  • Zabbix-(1)安装

    环境: VMware Workstation Pro 16.0 版本 系统 Centos7 …

    数据库 2023年6月14日
    075
  • 容器化 | 在 Rancher 中部署 MySQL 集群

    我们已经介绍了如何在 Kubernetes 和 KubeSphere 上部署 RadonDB MySQL 集群。本文将演示如何在 Rancher[1] 上部署 RadonDB My…

    数据库 2023年5月24日
    0125
  • Etcd 使用场景:通过分布式锁思路实现自动选主

    分布式锁?选主? 分布式锁可以保证当有多台实例同时竞争一把锁时,只有一个人会成功,其他的都是失败。诸如共享资源修改、幂等、频控等场景都可以通过分布式锁来实现。 还有一种场景,也可以…

    数据库 2023年6月6日
    0102
  • 设置颜色与画笔

    设置画笔 默认情况下,Graphics绘图类 使用的画笔属性是粗细为I个像素的正方形,而Graphics2D类可以调用 setStroke()方法 设置画笔的属性,如改变线条的粗细…

    数据库 2023年6月16日
    098
  • 需求评审,测试人员应该发挥怎样的价值?两分钟让你不再懵逼

    转载请注明出处❤️ 你好,我是测试蔡坨坨。 前些日与朋友聊天,谈及需求评审,作为测试人员,我们应该在需求评审会议上做些什么? 记得第一次参加需求评审,傻傻的过去坐着,然后听别人巴拉…

    数据库 2023年6月11日
    094
  • SpringMvc(二)- 请求处理参数 和 响应数据处理

    1、请求处理参数 1.1 请求参数 @RequestParam 1.1.1 不使用 @RequestParam 注解 请求参数处理, 不使用参数注解:1.如果 请求参数名和请求处理…

    数据库 2023年6月16日
    082
  • [SWPU2019] Android2

    有一个超长的线程延迟和永远为假的判断条件,应该就是要修改这两点。 使用apktool反编译apk之后,直接打开MainActivity.smali文件,找到 1000000000的…

    数据库 2023年6月11日
    073
  • mysql权限问题

    注意问题 grant all privileges on shop.* to ‘hosp’@’%’ flush privileges; 查询账号权限类型%和localhost是不同…

    数据库 2023年6月9日
    0159
  • MySQL事务ACID原理深度解析

    什么是MySQL事务? 事务是指对数据库的一组操作的集合,集合中的SQL语句要么全部执行成功,要么就全部失败,如果集合中任一操作出错,则此集合所有对数据库的操作全部回滚。 以常见的…

    数据库 2023年5月24日
    096
  • Java并发编程之CAS

    在Java并发编程的世界里,synchronized 和 Lock 是控制多线程并发环境下对共享资源同步访问的两大手段。其中 Lock 是 JDK 层面的锁机制,是轻量级锁,底层使…

    数据库 2023年6月11日
    080
  • 记录一次docker镜像拉取失败的问题

    syslog日志 Mar 13 08:42:41 xxx dockerd[30691]: time=”2022-03-13T08:42:41.928436506Z&#8…

    数据库 2023年6月9日
    0117
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球