论坛首页 Java企业应用论坛

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

浏览 22860 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (0) :: 隐藏帖 (13)
作者 正文
   发表时间:2011-01-12  
大数据量下,hibernate性能值的考验;
如果有跨月查询的情况,处理起来也有些麻烦,为什么不考虑用分区?
0 请登录后投票
   发表时间:2011-01-12  
finallygo 写道
建议还是不要分表的好,我之前就是采用分表的方式,现在发现在进行一些查询统计的时候挺悲剧的,所以建议还是分区比较好,如果你使用的是MYSQL 5.1以上的版本是支持HASH分区的,这样的话就可以不用经常修改数据库的分区了


hash分区,能增加按月查找的速度吗?这个没用过!
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-01-12
daoger 写道
大数据量下,hibernate性能值的考验;
如果有跨月查询的情况,处理起来也有些麻烦,为什么不考虑用分区?


即然在考虑表分区了,问题显然在数据库上。

我的例子中不需要这样的功能。真需要可以做一个视图,跨月问题即可解决。分区考虑过,不用是因为不想人工维护分区。
0 请登录后投票
   发表时间:2011-01-12  
如果查询所有的数据,还是有一定的屏景的吧,
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-01-12
海量数据查询,我想是要从需求和设计上来解决性问题的。

比如:要频繁的查询数据库表的条目数,对于大表,用count(*)就很慢。但是,如果做一个触发器,在表改变时自动计算表的条目数,把条目数存到另一个表中,这样查询就很快。

再优化代码,换框架,只要用count(*),是不可能比我说的方法更快的。


0 请登录后投票
   发表时间:2011-01-12  
CREATE TABLE clients (    
  id INT,    
  fname VARCHAR(30),    
  lname VARCHAR(30),    
  signed DATE
)PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;


官方文档上按月分区的例子
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-01-12
finallygo 写道
CREATE TABLE clients (    
  id INT,    
  fname VARCHAR(30),    
  lname VARCHAR(30),    
  signed DATE
)PARTITION BY HASH( MONTH(signed) )
PARTITIONS 12;


官方文档上按月分区的例子

看了一下,这个应该可以。不过我用的是Oracle,不知Oracle有没有这个功能?

另外,有些特殊的分表策略数据库是不能完成的。比如,A B两个表,A存详细数据,B存的是剪裁数据,A和B在程序中对应的是一个持久化类。需要按需求查询不同的表。
0 请登录后投票
   发表时间:2011-01-12   最后修改:2011-01-12
这个倒也是个可行的办法。但我们一般是分库+表分区。
用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。
另外想问一下,NamingStrategy为什么不行,你的是什么需求?
楼主你悲剧了,老被投隐。我觉得至多是个新手贴。哈哈。
0 请登录后投票
   发表时间:2011-01-12  
peterwei 写道
这个倒也是个可行的办法。但我们一般是分库+表分区。
用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。
另外想问一下,NamingStrategy为什么不行,你的是什么需求?
楼主你悲剧了,老被投隐。我觉得至多是个新手贴。哈哈。




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

活着就是一种修行!哈哈

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


0 请登录后投票
   发表时间:2011-01-12  
gdpglc 写道
peterwei 写道
这个倒也是个可行的办法。但我们一般是分库+表分区。
用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。
另外想问一下,NamingStrategy为什么不行,你的是什么需求?
楼主你悲剧了,老被投隐。我觉得至多是个新手贴。哈哈。




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

活着就是一种修行!哈哈

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



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

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