使用hibernate 分表做增删改查
公司项目有一张表的数据量特别大、而且时间越长累积的数据量就越大、
后来DBA决定分表来解决性能问题、
分表是指 一个母体表 一群子表(结构和字段与母体表完全一样) 我们程序对母表操作其实就是对子表操作、让其无法感知有分表这个动作、
而使用hibernate如何分表呢?
难道我要写N个子表类Domain吗?那累屎我算了、
呵呵、我们这里需要hibernate一个拦截器类 org.hibernate.EmptyInterceptor
这个拦截器做了什么呢?
hibernate最终会将我们写的HQL语句转换成SQL语句、而当转换SQL且没放如数据库执行的时候、被拦截器就拦住啦、我们就可以偷偷的"使坏"啦、
我们需要一个自己的类来继承org.hibernate.EmptyInterceptor
package cn.test;
import org.hibernate.EmptyInterceptor;
public class MyInterceptor extends EmptyInterceptor {
private String targetTableName;// 目标母表名
private String tempTableName;// 操作子表名
public MyInterceptor() {}//为其在spring好好利用 我们生成公用无参构造方法
public java.lang.String onPrepareStatement(java.lang.String sql) {
sql = sql.replaceAll(targetTableName, tempTableName);
return sql;
}
public String getTargetTableName() {
return targetTableName;
}
public void setTargetTableName(String targetTableName) {
this.targetTableName = targetTableName;
}
public String getTempTableName() {
return tempTableName;
}
public void setTempTableName(String tempTableName) {
this.tempTableName = tempTableName;
}
}
hibernate的session会获取吧?本文就不多做介绍了、
比如我们有个Test 实体类 对应的数据库的母表名称 为 test 而我们要保存到子表的 test_01要怎么做呢?
public void saveTest(Test test){
SessionFactory sf = super.getHibernateTemplate().getSessionFactory();//获取session工厂
MyInterceptor interceptor = new MyInterceptor();//我们的拦截器
interceptor.setTargetTableName("test");//要拦截的目标表名
interceptor.setTempTableName("test_01"); //要替换的子表名
Session session = sf.openSession(interceptor);//当前的session使用这个拦截器
try{
Transaction tx = session.beginTransaction();//获取事务
tx.begin();//开启事务
session.saveOrUpdate(test);//保存和更新
tx.commit();//提交
}catch(Exception e){
e.printStackTrace();
}finally{
session.close();
}
}
这样就能把信息存到子表test_01里啦、而且根本没人察觉我们的"使坏"、hibernate还老老实实的本份的做自己的工作呢、
CURD动作就这样被我们"使坏"着、
那我们总是new 出来 我们的拦截器 多么费劲啊、如果我还需要其他的地方还需要分表的地方、难道我还要再次new出来给多个地方用?
这样我们就在spring里多加一个bean 指向我们的class类
- <bean id="MyInterceptor" class="cn.test.MyInterceptor"/>
然后拦截器从spring拿就可以了、在setter进去目标表名和替换表名、
我们项目是web.xml加载了一个实现ApplicationContextAware类的一个类
static 的 ApplicationContext applicationContext 从里面getBean 就能拿到了
这样就ok啦、
使用hibernate 分表做增删改查的更多相关文章
- hibernate对单表的增删改查
ORM: 对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 实现对单表的增删改查 向区域表中增加数据: 第一步: 新建一个Da ...
- django模型层 关于单表的增删改查
关于ORM MTV或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库, 通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员 ...
- Mysql数据表的增删改查
---恢复内容开始--- Mysql数据表的增删改查 1.创建表 语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...
- MySQL数据库之表的增删改查
目录 MySQL数据库之表的增删改查 1 引言 2 创建表 3 删除表 4 修改表 5 查看表 6 复制表 MySQL数据库之表的增删改查 1 引言 1.MySQL数据库中,数据库database就是 ...
- MyBatis-单表的增删改查(CRUD)操作
在学习MyBatis的单表的增删改查操作之前,还是再次熟悉下MyBatis这个框架,只有对其熟悉的情况下,才能很好的使用,灵活的开发. MyBatis优点: ...
- day 57 data 插件 表的增删改查
一 data的含义 在匹配的元素集合中的所有元素上存储任意相关数据或返回匹配的元素集合中的第一个元素的给定名称的数据存储的值. 1 .data(key, value): 描述:在匹配 ...
- Hibernate5笔记2--单表的增删改查操作
单表的增删改查操作: (1)定义获取Session和SessionFactory的工具类: package com.tongji.utils; import org.hibernate.Session ...
- MVC学习-用EF做增删改查
在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...
- Django学习笔记(10)——Book单表的增删改查页面
一,项目题目:Book单表的增删改查页面 该项目主要练习使用Django开发一个Book单表的增删改查页面,通过这个项目巩固自己这段时间学习Django知识. 二,项目需求: 开发一个简单的Book增 ...
随机推荐
- aspose.words 处理word转PDF
处理如下: import com.aspose.words.Document; import com.aspose.words.SaveFormat; import com.platform.cust ...
- html5介绍 之亮点特性
html5 兴起- 乔帮助在2010年发布的:关于对flash的思考,提到有了h5放弃 flash 1 富图形,富媒体 2 本地存储 cookie 3 LBS 基于 ...
- python----脚本文件的头部写法。
#!/usr/bin/python #这里主要是为了指明python脚本解释器的路径. #!coding:utf-8#这个是为了告知python脚本文件解释器,此脚本的字符集. import sys ...
- SQL Server 无法启动之TCP端口占用
场景再现: ---------------------------------------------------------------------------------------------- ...
- JProfiler解决Java服务器的性能跟踪
转自:http://www.blogjava.net/anymobile/articles/28248.html
- 【Python】iiacm_filemaker ——简易的.cpp文件创建即初始化脚本,ACMer专用
代码已全部重写,上次写的真是不忍直视…… 今天刚刚接触Python,本着学以致用的原则,就写了一个按照要求自动生成.cpp文件并初始化头文件的脚本. 确定你的linux中安装了Python,将下面的代 ...
- Android 给Button加个监听
1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码 1.页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextV ...
- AndroidUI 侧滑菜单 DrawerLayout的使用
直接上代码: activity_main.xml: <android.support.v4.widget.DrawerLayout xmlns:android="http://sche ...
- auto, extern, register, static
对于一个数据的定义,需要指定2中属性: 存储类型和数据类型: static int a; auto char c; register int d; 1 auto 2 extern 3 register ...
- c++犯过的严重错误
1.if(num == 0)写成了if(num = 0)导致软件运行一直崩溃且找不到原因,浪费了很大的代价,以后我写这种语法的时候一直写if(0 == num) 2.if (sting.find(&q ...