Java的ORM框架 Guzz
guzz是一套用來進行快速開發和高性能網站設計的框架,通過ORM、多數據源數據管理、切表、以及通用數據處理,為系統在數據層的設計提供一站式解決方案。用于替代或者補充hibernate或ibatis,并提供更多的大型系統架構設計支持。
簡單來說,guzz 讓你可以將系統中的每張表存儲到不同機器的不同數據庫中;當某些表的讀取頻率較高時,可以隨時進行主從分離,擴展N臺讀數據庫;當某些表增長較大時,可以將大表分切成無數張小表,如果需要還允許每張小表有擁有自己的特殊字段。編程時,像hibernate一樣簡單的通過領域對象來操作分布復雜的應用數據和多庫之間的分布式事務。guzz也會影響您的編程習慣,設計時考慮更多的數據擴展與分布,寫代碼時使用更多的批操作。
guzz的目標是使得大型化網站設計更加簡單,團隊分工更加明確,框架在使用時更少出問題。主要功能:
- 現代大規模系統設計,技術上吸收了ibatis/hibernate的優點
- 對于大部分場景,支持像hibernate一樣的對象持久,映射和方便的增刪改查,提高開發效率。
- 對于復雜場景,支持像ibatis一樣,讓dba參與sql設計的復雜數據庫操作和優化,以及SQL在線調試。
- 更簡潔,更好用,更容易控制的批操作接口。
- 支持在線加載與調試SQL。按照應用策略,從文件/數據庫/Web Service等途徑,動態提取與使用SQL語句(Dynamic SQL)。
- 支持應用使用大量的數據庫和主從讀寫分離
- 支持數據表在多組機器中水平分布(Shard),并自動維護多組機器之間的分布式事務
- 支持1張表按照業務規則分切成多張小表(Shadow),并支持每張小表擁有自己特殊的屬性字段(Custom)。
- 支持超越范式的特殊關聯、非結構化數據等異構資源POJO模式的統一管理
- 支持組件化服務(SOA),構建企業/項目實施基礎平臺
- 提供面向對象的數據庫讀取標簽(JSP Taglib),加快頁面展示層的快速變更、開發與部署
- 支持配置管理服務器,可以使用一套軟件系統對所有應用系統的配置項進行統一管理
功能設計理念
ORM:guzz 的ORM功能參考ibatis和hibernate的設計而來,同時具備ibatis的復雜查詢在xml中配置以及簡單的CRUD類似hibernate 全部對象化管理的特點,適用于大部分數據庫操作比較簡單(關心進度和技術門檻),而某些性能攸關 sql需要單獨維護和調優的項目(關心性能)。
多數據源管理:多數據源管理是指guzz可以同時管理多組數據庫,在執行查詢時根據要查詢的對象,自動分配到正確的數據庫機器組執行查詢操作。每一組可能包含主從,guzz自動分配主從庫的操作。這樣做到的效果是:在數據庫設計時表的存儲位置和主從設計完全對開發人員透明;并在以后需要擴展時,可以按照表將數據庫分散到多組機器上,并行擴展。
多數據源管理還包括對異構數據的統一管理,如一些對象的某些屬性并不保存在數據庫里,如基于某種考慮需要先驗證在讀取或先查緩存再讀數據庫等。對于這種另類的方式,往往開發人員都是遇到一個特殊代碼處理一個,非常混亂;而guzz可以通過自定義屬性加載進行統一管理,在普通開發人員看來,并不需要了解數據的具體存儲和讀取過程。使用這些異構來源數據,就像使用普通的pojo一樣簡單。這類場景尤其適合于后臺開發與前端頁面設計分離的開發團隊,對前端提供的接口越簡單越統一,實施成本就越低(如產品部門與實施團隊),對后端產品的侵入也越低。
通用數據處理:guzz 將某些通用的數據和處理模型定義為服務(Service),如用戶登錄與認證、 Session 管理、IP地址到地理位置的映射、通過字符獲取驗證碼圖片等。這些服務包括數據和數據的運算處理,這些數據和數據運算guzz當作一類特殊的數據進行管理,用于多個項目之間實現共享。這些服務合在一起可以構成企業或項目的基礎平臺,越積累越多,guzz通過對這些服務的重復利用大幅度降低重復開發成本。
Guzz JSP Taglib:為了使java web開發更加靈活,像php一樣方便變更,guzz引入了面向對象數據庫標簽。面向對象數據庫主要用于快速開發與快速變更,并解決產品落地實施難題。
根據經驗,在中國肯花錢購買的項目一般都會要求定制。在定制過程中,一般后臺功能和內部流程是不變的,往往需要變化的就是頁面;例如論壇列表頁面要求增加一個公告,要求顯示出好友列表,要求把用戶A(總裁)的帖子自動放在第1條,等等。對于這些變化,基于傳統的MVC架構,需要先修改manager提供接口獲取數據,在修改Action提取數據,在修改jsp顯示數據,從上往下代碼修改無一幸免。如果是一套產品,有幾個項目實施下來,產品核心會越來越小,項目間代碼相互沖突,管理越來越困難,而產品團隊基本上也都全部下放到了項目實施團隊(java底層代碼實施團隊往往不愿意碰)。基于guzz的標簽,這類頁面定制實施問題就可以迎刃而解了;只要產品團隊提供出領域對象模式,實施人員便可以自己按照客戶需求完成數據提取與展示。
綜述:guzz 并不僅僅是提供一種ORM映射,而是提供一套完整的數據層架構,用于解決項目中可能遇到的各種數據類型和數據處理策略,統一數據接口,簡化項目架構設計。 guzz提供的可配置的多數據源管理方式,一般大型系統都有自己的實現策略;guzz抽象出這些,對于新項目就不用再摸索了,尤其是多數據庫組和主從分離完全可以為系統提供面相未來的支持。
開始guzz教程: http://code.google.com/p/guzz/wiki/AboutGuzz?wl=zh-Hans
示例代碼:
TransactionManager tm = guzzContext.getTransactionManager() ; ReadonlyTranSession session = getTransactionManager().openDelayReadTran() ; try{ SearchExpression se = SearchExpression.forClass(SystemLog.class) ; se.and(Terms.eq("categoryId", 18)) ; se.setOrderBy("importance desc, id asc") ; return session.list(se) ; }finally{ session.close() ; }