打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
主题:通过hibernate拦截器实现自定义分表策略
我参与的某项目出现了一个这样的需求。用户的每个月的数据库很大 >1000W。用户需要针对每个月做查询。为了加快用户的查询速度,这里打算按月分表存数据。怎么用hibernate实现这个功能呢。

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

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

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

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

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

具体实现如下:
Java代码
  1. public class QueryResInterceptor extends EmptyInterceptor {   
  2.           ...   
  3.             
  4.          public QueryResInterceptor(Date startTime, Date endTime){   
  5.           ...   
  6.          }    
  7.     public String onPrepareStatement(String sql) {   
  8.         //根据用户的时间替换sql中的表名   
  9.         return sql;   
  10.     }   
  11. }  

这个拦截器,接收用户的查询时间做为构造参数。然后做为替换sql中表名的依据。

当我执行一个查询的hql时,hql是按映射的持久化类写的。用如下代码获得Session
Java代码
  1. QueryResInterceptor  i=new QueryResInterceptor(...);   
  2. Session sessoin=sessionFactory.openSession(i);  


这样再通过这个session执行hql时,表名就自动换成需要的实际表名了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Hibernate 笔记2 关于配置文件和表映射
Hibernate 插入,修改,删除,查询语句
hibernate 通用泛型DAO
在Hibernate应用中如何处理批量更新和批量删除?
学习笔记之 O/R 映射技术的王牌Hibernate框架
NHibernate Step by Step
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服