Jive笔记6 --Database Package下面的暗黑世界

原创 2003年05月30日 14:54:00

Jive笔记6 --Database Package下面的暗黑世界

Jive笔记6 --Database Package下面的暗黑世界

Written by Shyguy
2002/12/27
Jive再牛B,归根到底还是要和Database打交道的。还不是要调用getConnection(),CreateStatement(),ResultSet.next()。
那么,我的疑问是,Jive是怎样处理低层操作类(DBForumMessage/DBForumThread/DBForum)之间的耦合关系的呢?
由于存在了Cache,所以,DBForumFactory/DBCacheManager/DBForumXXX这些类之间的关系可谓是错综复杂。

(1)真正实作中,我们怎样来完成加载一个ForumMessageObject? 还有thread的增加删除Message是怎样完成的?
打开DBForumMessage.java,发现,除了完成ForumMessage Interface的方法以外,还有几个Private的方法和Protected的方法。
分别是:
private void loadFromDb();
private void saveToDb();
protected void insertIntoDb();等

上面三个函数分别用来完成对jiveMessage表的SELECT/UPDATE/INSERT操作。
所以初步可以判定,对jiveMessage表的操作,基本上封装在了DbForumMessage里边了。但不是全部,为什么?慢慢往下看。

a.加载DbForumMessage
非常简单,地球人都知道的代码。在一个构造函数中调用loadFromDb(),然后执行SELECT xxx,xxx,..WHERE id=...,如果rs为空则抛出
MessageNotFoundException,否则,一个一个的把字段内容复制给DBForumMessage的成员变量。
(顺便这里提一下,这些映射数据库字段的成员变量有些是Private的,有些是Protected,为什么呢?呵呵。)
对于这样的加载方法,如果没有Cache,将会非常慢的。试想,每次显示一个Message都要一次Select,我浏览Thread页面的时候,一次显示n个Thread/Message,....
还不要数据库的小命啊。

在我克隆Jive的过程中,由于Cache机制将在以后实现,所以采取了一个折衷的办法。改写了DBMessageIterator()类,改原来的只取ID
取回除了Body以外的所有的内容,并且 直接就地New DBForumMessage,然后复制到ArrayList。
至于Body,则采用LazyLoad的方法,等用到了才去SELECT body FROM ...
这样处理,由于有ResultFilter的限制,最多复制几十个没有Body的DBForumMessag 对象,这对于AppServer来说,我想影响不大吧?

b.增加DBForumMessage
也就是调用INSERT INTO jiveMessage啦。不过,注意到,在插入新的ForumMessage纪录的时候,ThreadID是必须的,
所以看起来只能让DBForumThread来调用这个方法了。难怪!!用了protected insertIntoDb(DbForumThread)!! 原来,同在一个包下的class是
可以互相访问protected的方法的。偶java基本功不行,呵呵,到了今天才发现的这种现象。

c.删除DBForumMessage
这个比较有趣,DBForumMessage没有任何执行DELETE FROM jiveMessage的代码,看起来一定是在外边DBThread实现了。
毕竟,这个是thread的事情嘛。果不出所料,DbForumThread::deleteMessage()里边直接执行了DELETE SQL.
我自己在Clone Jive的时候,还是作了小改动,给DbForumMessage添加了protected deleteFromDb()方法,把执行SQL的操作放给Message完成了。

在对Message进行Add/Delete操作过程中,可不能忘记了Cache List的更新,所以必须记得在DbForumMessage中调用cacheManager的一些方法
来更新Cache,虽然目前在我的系统中,这些函数是空的 :)。

明白了Thread/Message之间的"父子关系",Forum/Thread Category/Forum之间的关系也就差不多啦。哦,Jive中的Category好像有点特别,
等偶下次看了代码再另外详细汇报。

(2)DBForumFactory是个什么东西?
Jive2.1.1以后,DbForumFactory不给Source了,而且,JAD还很难反编译,因为我发现JAD无法反编译诸如synchronized(Object){}这样的代码。
还好我们有Jive 2.1.1的代码。哈哈。看看再说。
先把DBForumFactory的身份给揭穿。其实DbForumFactory是个总管。总管Forum/Thread/Message。
所以,我们在调用API的时候,都是通过Factory.getForum()/getThread()/getMessage()来获得那些对象。
Jive用了SingleTon保证DbForumFactory()唯一,即静态方法DbForumFactory.getInstance()。
同时,DBForumFactory在构造函数中New了一个DatabaseCacheManager。因此Factory和CacheManager就这样勾结起来了。
所有调用getForum(),getThread(),getMessage(),都是调用DatabaseCacheManager的相关方法来实现的。
例:

DBForumFactory::getThread() ==> DatabaseCacheManager.getThread() ==> Search Cache or new DbThread object


结论,DbForumFactory不是东西。除了检测Licese是否合法,其它基本上就是一个二道贩子。

(3)其实还有那些Thread/Message的DbIterator,在Jive笔记4中已经提到了。不必再罗嗦一遍。

写了这么多,感觉还有好多东西没有讲。我希望大家能够仔细体味里边的protected 属性/方法,我认为,这些东西其实和友元差不多,
它们部分的打破了封装,但是获得了很大的灵活性。
退后一步想想,我们只要把那些东西一股脑儿的限制在database package里边,对于整体上的封装,还是没有什么影响的。


呵呵,一家之言,请大家不吝指教
Shyguy

 

【官方文档】《暗黑世界GM管理后台系统》部署+功能说明

欢迎来到9秒:www.9miao.com 暗黑三国管理后台说明文档 (一)功能描述 该后台共分为三大部分:服务器管理、单服数据统计和扶持账号管理。 1.服务器管理: ...
  • uxqclm
  • uxqclm
  • 2013年09月24日 11:44
  • 1510

windows环境暗黑世界服务器端1.6版本,android客户端1.4版本搭建(亲测通过)

最近在使用firefly看服务器端长连接和心跳包实现的相关代码,据说单服负载量是1万左右,真不知道真假。在9秒上找到firefly开发的游戏暗黑世界的代码,首先要过的就是编译关,然后搞了3天,真是各种...
  • meiliangdeng1990
  • meiliangdeng1990
  • 2016年04月03日 02:00
  • 371

暗黑世界 客户端 通信

通信
  • jindou910101
  • jindou910101
  • 2013年09月12日 06:08
  • 881

U3D版本《暗黑世界V1.0》编译——图文教程!

欢迎来到9秒:www.9miao.com 说明:         A. 工具准备:                 1. Unity3d  版本需4.0以上          ...
  • uxqclm
  • uxqclm
  • 2013年09月24日 12:08
  • 1281

windows 下 暗黑世界 客户端 的 测试

windows 下 暗黑世界 客户端 的 测试
  • jindou910101
  • jindou910101
  • 2013年09月10日 10:04
  • 2087

暗黑破坏神(DIABLOII 1.11B)BOT制作(一)

暗黑破坏神(DIABLOII 1.11B)BOT制作(一)暗黑破坏神(DIABLOII)是十几年前暴雪推出的一款经典网络游戏,是网络游戏的开山经典之作,很多玩家都是从大菠萝1.09时代开始玩起,从1....
  • LingLingQI_Leon
  • LingLingQI_Leon
  • 2017年04月17日 22:15
  • 1556

windows 下 暗黑世界 服务器端 的 搭建

为了测试《暗黑世界》客户端,所以搭建《暗黑世界》服务器端,特此记录共享! 这个框架基于python编写,第三方库依赖:twisted, python-memcached,DBUtils,MySQLdb...
  • jindou910101
  • jindou910101
  • 2013年09月10日 00:00
  • 3062

MongoDB学习笔记

一、安装 下载地址:http://www.mongodb.org/downloads 按步骤进行安装,类型我选的是custom 二、配置环境 先将mongodb的安装目录下的...
  • xiaoquantouer
  • xiaoquantouer
  • 2016年06月03日 12:31
  • 457

Unity Minecraft 我的世界 核心渲染机制的简单实现 一个面的渲染

版本:unity 5.4.1  语言:C#   最近在看MC的代码,但是10M的代码看得我实在够呛,后来去找了一些Unity相关实现的工程,可惜国内都使用的是cube来做方块,渲染一万个方块还好,百万...
  • u012632851
  • u012632851
  • 2016年12月22日 14:44
  • 1209

【机器学习-斯坦福】学习笔记6 - 朴素贝叶斯

本次课程大纲: 1、 朴素贝叶斯 - 朴素贝叶斯事件模型 2、 神经网络(简要) 3、 支撑向量机(SVM)铺垫 – 最大间隔分类器...
  • maverick1990
  • maverick1990
  • 2013年11月14日 12:41
  • 4769
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Jive笔记6 --Database Package下面的暗黑世界
举报原因:
原因补充:

(最多只允许输入30个字)