论坛首页 Java企业应用论坛

guzz1.2.6发布,支持blob/clob

浏览 2125 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-01-29  
guzz是一套用来解决ORM、多数据源数据管理、以及通用数据处理的数据层框架,为系统在数据层的设计提供一站式解决方案。guzz可以看作是 ibatis/hibernate的一大的延伸,并可以取代这2个东西。

Guzz特点:
   
  • 现代大规模系统设计,技术上吸收了ibatis/hibernate的优点
  •    
  • 支持像hibernate一样的对象持久、映射和方便的增删改查
  •    
  • 支持像ibatis一样,让dba参与sql设计的复杂数据库操作和优化
  •    
  • 支持应用使用大量的数据库和主从读写分离
  •    
  • 支持关联、非结构化等异构数据统一管理
  •    
  • 支持数据表在多组机器间水平分布(Shard)
  •    
  • 支持组件化服务(SOA),构建企业/项目实施基础平台
  •    
  • 支持页面展示层的快速变更、开发及部署
  •    
  • 支持配置管理服务器,对所有应用程序的配置进行统一管理

项目地址:[url] http://code.google.com/p/guzz/ [/url]

1.2.6更新介绍:

  • 支持byte, decimal,blob/clob等数据类型
  • 提供大型blob/clob的自定义属性Loader,用于应用自己控制blob/clob的扩展处理
  • 支持在更新对象或对象某一个属性(有单独api)前加入行写锁。
  • fix some bugs.

Blob/Clob应用示例说明:

假设有一个用户信息扩展表,里面存放用户头像图片数据和无限制大小的自我介绍。分别设计为blob和clob字段存储。下面的例子重点介绍blob使用,clob类似。

领域对象定义:

public class UserInfo {
	
	private int id ;
	
	private String userId ;
	
	private TranClob aboutMe ;
	
	private TranBlob portraitImg ;
    //get&set methods

其中TranClob和TranBlob为guzz对Lob的一层封装。可用于在lazy load时释放lazy load获取的数据库资源。Guzz的lazy处理没有hibernate的OpenSessionInView尾巴,因此对于因lazy而临时获取的资源需要自己关闭。

配置对象映射(以头像图片为例):

        <property name="portraitImg" type="blob" column="portraitImg" lazy="true"></property>    

应用实现blob的插入:

FileInputStream fis = new FileInputStream(“a big file.png”) ;
		
		WriteTranSession tran = tm.openRWTran(false) ;		
		
		try{
			UserInfo info = new UserInfo() ;
			info.setUserId("lucy") ;
			info.setPortraitImg(Guzz.createBlob(fis)) ;
			tran.insert(info) ;

			tran.commit() ;
		}catch(Exception e){
			tran.rollback() ;			
		}finally{
			tran.close() ;
fis.close() ;
}

更新:对于Oracle数据,插入Blob需要先插入空,在更新,下面代码说明如何将图片存入Oracle库:
FileInputStream fis = new FileInputStream(“a big file.png”) ;
		
		WriteTranSession tran = tm.openRWTran(false) ;		
		byte[] tb = new byte[1] ;
		tb[0] = 1 ;
		try{
			//先插入一个空的
			UserInfo info = new UserInfo() ;
			info.setUserId("lucy") ;
			info.setPortraitImg(Guzz.createBlob(tb)) ;
			tran.insert(info) ;
tran.commit() ;
			//再读取进行更新,读取时自动获取行锁
			TranBlob blob = (TranBlob) tran.loadPropForUpdate(info, "portraitImg") ;
		blob.truncate(0) ;
		blob.writeIntoBlob(fis, 1) ;
		tran.commit() ;
		}catch(Exception e){
			tran.rollback() ;			
		}finally{
			tran.close() ;
fis.close() ;
}
 

显示:存入数据库以后,设计了一个jsp页面,用来读取并显示用户头像(大致步骤)。

<%@page language="java" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.guzz.org/tags" prefix="g" %> 

<!-- 根据参数uid读取用户信息 -->
<g:get business="userInfo" limit="userId=${param.uid}" var="m_userInfo" />

<%
UserInfo info = (UserInfo) page.getAttribute("m_userInfo") ;

//获取Blob字段。此处为lazy读取,会打开一个从数据库连接,读取blob字段。
TranBlob img = info.getPortraitImg() ;

//将blob数据写入到JSP页面输出中
img.writeOut(out) ;

//关闭lazy读取时申请的数据库连接
img.close() ;

%>

大功告成。在整个过程中,写入和更新类似于hibernate,但读取与展示这类最可能遇到需求变来变去的东西,与其他框架相比能节省大量的编码和部署工作(JSP不需要重启)。

下一版本1.2.7开发计划:

  • 提供表分切支持。允许同一对象按照业务规则,分别存储在不同的表中,guzz提供统一管理。如新闻评论:新闻频道的评论存放在tb_c1,娱乐:tb_c2,体育tb_c3,其他:tb_c4,满足同类在线数据的数据表平行扩展需要。表分切技术命名为:ShadowTable
  • 支持远程服务未来读取结果功能。用于支持多个远程服务可以同步的调用。详细介绍可以参看:org.guzz.service. FutureResult中的代码注释。
  • 其他新发现的bug和有价值功能.

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics