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

本文介绍了一个项目需求,由于用户每月数据量超过1000万,为提高查询效率,需要按月进行分表存储。通过研究Hibernate,发现可以利用Interceptor拦截器在用户操作数据库时动态修改SQL,从而实现根据时间选择不同表的查询,避免为每个表创建单独的持久化类。文章提供了Interceptor的实现思路和方法。
摘要由CSDN通过智能技术生成

转载自:http://www.iteye.com/topic/866142

我参与的某项目出现了一个这样的需求。用户的每个月的数据库很大 >1000W。用户需要针对每个月做查询。为了加快用户的查询速度,这里打算按月分表存数据。怎么用hibernate实现这个功能呢。

比如,分出12个表,每个保存一个月的。每个表的字段是一模一样的。区别只是当用户查询时,要选择不同的表。如果配出12个持久化类来,这样的设计太死了。于是想到hibernate能不能自动根据时间先择要操作的表。

研究了一下还真行。
刚开始也看到别人说类似的需求,用的是Hibernate的 NamingStrategy接口,想通过它想办法在执行sql时,动态的改变持久化类和表的对应关系。后来发现不行。

因为NamingStrategy只在Hibernate SessionFactory生成时调用一次,以后就不调用了。因此根本不可以在调用时通过它改变持久化类和表名的关系。

后来经过终于找到了:Interceptor
它是hibernate的拦截器。当用户操作数据库时,会把生成的sql先给Interceptor处理一下,然后再去执行。这正给了我修改sql的机会。

这样,只要做一个持久化类,和这12个表中的一个映射。然后做如下的拦截器:

具体实现如下:

public class QueryResInterceptor extends EmptyInterceptor {   
          ...   
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值