首先,guzz在09年就发布了,那时我还在读书呢。这是一款不错的软件,但这几年沉寂了,没有好好发展下来,有点可惜。
https://github.com/liukaixuan/guzz
guzz是国人开发的一款java orm, 它的主要功能有:
你的系统使用太多的表,或者这些表占用了1台机器太多的资源;你可以用dbgroup将不同的表分到多台数据库中(垂直分库)。具体参看第3节: TutorialGuzzXml
感受:
某些表太大;你可以使用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功能还是比较强大的,还是值得称赞的,但以下几点,我觉得不妥: