论坛首页 Java企业应用论坛

通过hibernate拦截器实现自定义分表策略

浏览 22930 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (13)
作者 正文
   发表时间:2011-01-12   最后修改:2011-01-12
peterwei 写道
gdpglc 写道
peterwei 写道
这个倒也是个可行的办法。但我们一般是分库+表分区。
用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。
另外想问一下,NamingStrategy为什么不行,你的是什么需求?
楼主你悲剧了,老被投隐。我觉得至多是个新手贴。哈哈。




NamingStrategy只在hibernate SessionFactory初始化时调用一次,以后就不再调用了。就算调用,想把查询日期传到NamingStrategy里也很困难,因为全局只有一个。这个功能要的急,当时想它要是好使,我用ThreadLocal传也行呀...

活着就是一种修行!哈哈

分库+分区怎么做,用一种感觉设计和维护上都简单呀?



NamingStrategy分表是可行的,网上已经有很多例子了。我说的分库+分区,是指数据量很大的情况下,根据需求,例如先按省分库,然后每个省里再用表分区(分表当然也行)。当然这种数据量大的,跨区域查询总会是件比较麻烦的事。增删改就让路由程序调度好了。你1000万数据量,oracle里用表分区就够了。

你说的是数据的水平切分吧,如果用oracle的话,到没有什么问题,因为有DBlink啊,可惜我们用的是mysql,掩泪飘过~~
0 请登录后投票
   发表时间:2011-01-12  
peterwei 写道

NamingStrategy分表是可行的,网上已经有很多例子了。我说的分库+分区,是指数据量很大的情况下,根据需求,例如先按省分库,然后每个省里再用表分区(分表当然也行)。当然这种数据量大的,跨区域查询总会是件比较麻烦的事。增删改就让路由程序调度好了。你1000万数据量,oracle里用表分区就够了。


请教一下“路由程序”是什么原理? 比如Oracle,你说的分库是指做多个Oracle实例是吧? 但是这样,你怎么让程序在两个实例上切换呢?
0 请登录后投票
   发表时间:2011-01-12  
gdpglc 写道
peterwei 写道

NamingStrategy分表是可行的,网上已经有很多例子了。我说的分库+分区,是指数据量很大的情况下,根据需求,例如先按省分库,然后每个省里再用表分区(分表当然也行)。当然这种数据量大的,跨区域查询总会是件比较麻烦的事。增删改就让路由程序调度好了。你1000万数据量,oracle里用表分区就够了。


请教一下“路由程序”是什么原理? 比如Oracle,你说的分库是指做多个Oracle实例是吧? 但是这样,你怎么让程序在两个实例上切换呢?

分库是指多个oracle实例。我说的分库可能并不应用在你的需求场景。我们在联通的一个项目里就按省分库。有一些集团到省,省到省的业务,我们都是通过ActiveMQ和web service实现。省和省间的业务是尽量避免的,因为会涉及到跨库事务,虽说有jta可用,也是比较麻烦的。
路由程序的原理,说白一些,就是先解析你要执行的sql语句,然后根据分表的规则,重新组装sql语句执行。举个实际的例子说吧:
引用
select xxx from company where companyCode='GM' and other param

分表规则是按公司代码执行。

组装后代码变成:
select xxx from companyGM where other param


基本上呢就是说在数据库层和业务层之间加上一层DAL路由层(Data access layer).DAL方式的好处是可透明化分库、分表对业务服务器带来的影响。网上有一些开源的DAL框架,例如Amoeba,应该是国内某牛开发,感兴趣可以查一下。
我觉得hibernate shards框架就是基于DAL路由原理实现的。
0 请登录后投票
   发表时间:2011-01-12  
明白了,多谢指点了。还以为你们一个应用程序会用多个Oracle实例呢。shards早已有所耳闻,可惜没有相关的项目,呵呵...
0 请登录后投票
   发表时间:2011-03-03  
最近也在研究这个,想做个类似日志的切面动作,就是将更新前后的数据监听放入到日志表中,不过在用到PostUpdateEventListener中的postUpdateEvent.getOldState()的时候一直为空,不知道各位有没有什么研究?
0 请登录后投票
   发表时间:2011-04-07  
从来没用过这东东,做过的项目貌似要分表就直接用JDBC来搞了

不过还是学习下,毕竟用Hibernate操作很方便
0 请登录后投票
   发表时间:2011-04-07  
这个很有用,绝对的!
希望能详细的讲一下!
起始有些时候还真需要去运用分表来解决!没办法!
0 请登录后投票
   发表时间:2011-07-27  
请问下楼主,hbm文件里 table属性应该怎么填呀
0 请登录后投票
   发表时间:2011-07-27  
       hibernate 操,现在的公司不用都荒废了唉!
0 请登录后投票
   发表时间:2011-07-28  
hibernate又一次让我觉得强大!这个值得研究一下,很不错
0 请登录后投票
论坛首页 Java企业应用版

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