联系
Knight's Tale » 技术

guzz orm使用感受

2015-05-13 17:23

前面的话

首先,guzz在09年就发布了,那时我还在读书呢。这是一款不错的软件,但这几年沉寂了,没有好好发展下来,有点可惜。

https://github.com/liukaixuan/guzz

功能使用感受

guzz是国人开发的一款java orm, 它的主要功能有:

  • 你的系统使用太多的表,或者这些表占用了1台机器太多的资源;你可以用dbgroup将不同的表分到多台数据库中(垂直分库)。具体参看第3节: TutorialGuzzXml

    感受:

    • 优点:guzz确实是可以定义很多个表,还可以分组之类的。提供统一的一个管理配置。
    • 缺点:这边做了多个库,但是具体实现时,只是做了一个简单的路由层,不管是读或写,只能支持一次对一个库进行操作,并没有实现业务合并的操作。合并的操作对于业务是非常重要的,可以极大的减少业务层的工作。所以这里显得比较鸡肋。
  • 某些表太大;你可以使用ShadowTable将它分切成许多张小表(水平分表)。具体参看第16节: TutorialShadowTable

    感受:

    • 优点:和第一个功能是相似的。
    • 缺点:和第一个功能是相似的。
  • 某些业务对象比较特殊,如购物网站,每个商品除了公共属性,还要拥有一些自己的特殊属性;你可以使用CustomTable将每个商品存储到 一张单独的小表,然后给每张小表设置私有字段(水平分表 + 自定义属性)。具体参看第17节: TutorialCustomTable

    感受:这个功能我平时使用的不多,不做评价。

  • 虽然按照第2,3项对大表进行了分切,但分出的小表太多,或者这些小表都在一台机器上还是占用了太多资源;你可以用 VirtualDB 将小表分布到不同的数据库组中(垂直分库 + 水平分表)。具体参看第18节: TutorialVirtualDB

  • 某些字段比较大或者比较特殊,不适合存储到数据库中,如需要存到文件系统中, 或memcached中, 或其他什么地方;使用 CustomColumnLoader 实现自定义属性加载。具体参看第12节: TutorialLazyLoad

  • 系统实在太忙,某些表1台机器无论如何也跑不下来。这个最简单,你可以随时增加更多机器,做为“读/从数据库”,用guzz编写的程序默认就实现了读写分离。

    感受:

    - 优点:guzz的读写分离和传统的读写分离不一样。guzz提供了读、写API,为程序员提供了可控性。
    - 缺点:程序员需要明确的去感知读写API操作。增加了侵入性。我和guzz作者聊过,他说可以通过封装来解决此问题。但是我还是觉得这样对代码侵入性太大。程序员写一个代码要考虑要用读API还是写API这是个头疼的问题。更好的做法,我认为是在dbproxy通过事务来做读写分离(非事务的读走从库,事务的读写走主库)或者,通过配置。(不管如何,通过事务来控制读写分离我觉得是比较稳妥的)
    

其它感受

guzz功能还是比较强大的,还是值得称赞的,但以下几点,我觉得不妥:

  • 太过强大。它将orm, SOA, distribute config都放在一个client里了。然后它的后两个功能都做得不强很鸡肋。最重要的还是它的ORM。我认为guzz应该专注于orm,而不是什么都想做,把一堆关系不大的都放在一起。或者应该是提供tool来解决。
  • search api太弱。类似"delete from @@" + FriendsAction.class.getName() + " where @copiedFrom = :copiedFrom and @owner = :owner"这样的查询让人使用起来有点难以接受。另外,也没有提供链式操作。
  • 想要兼容ibatis,hibernate。为了兼容这两者,使用hbm文件来定义,一些规则还没有完全兼容。我觉得如果想做得更好一点,应该完全放弃这两者,做一个干净、简单的orm.

ref

  • guzz: https://code.google.com/p/guzz/wiki/TutorialStart?wl=zh-Hans
本文链接地址:guzz orm使用感受