服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jive笔记--database package下面的暗黑世界


  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里边,对于整体上的封装,还是没有什么影响的。
  
  呵呵,一家之言,请大家不吝指教

扫描关注微信公众号