公司项目有一张表的数据量特别大、而且时间越长累积的数据量就越大、
后来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;
- }
- }
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();
- }
- }
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"/>
<bean id="MyInterceptor" class="cn.test.MyInterceptor"/>
然后拦截器从spring拿就可以了、在setter进去目标表名和替换表名、
我们项目是web.xml加载了一个实现ApplicationContextAware类的一个类
static 的 ApplicationContext applicationContext 从里面getBean 就能拿到了
这样就ok啦、
相关推荐
NULL 博文链接:https://houjiang2100.iteye.com/blog/972641
基于spring+hibernate 实现的分表插件,可以定义分表策略,本代码只提供一个思路,具体的实现逻辑还是要基于具体的业务开发,重复造轮子并不可耻,出了问题大不了重造
spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。
- 我为什么做这个 - 很简单,网上很多关于分表的都是含糊其辞,没有任何详细的,通用的,既然没有,那么我写一个出来吧。 - 主要目的 - 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是...
一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据
分表是一种数据库分割技术,用于将大表拆分成多个小表,以提高数据库的性能和可管理性...在MySQL中,可以使用多种方法进行分表,例如基于范围、哈希或列表等。下面将详细介绍MySQL如何分表以及分表后如何进行数据查询。
基于hibernate的mysql分表分库实例-mysql-cluster-hibernate
下面小编就为大家带来一篇spring hibernate实现动态替换表名(分表)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致...分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。
kettle对数据分表插入 数据库Oracle etl工具 kettle 通过java脚本,hash算法,实现分表数据写入
应对sharding-jdbc结合mybatis实现分库分表功能 分表的联合查询采用将mysql的数据同步到elasticsearch进行筛选
sharind-jdbc样例,当中包含了按月动态分表,一个比较简单的demo,大家可以结合自己的需求进行修改,以及可以看下实现思路,仅供参考!
基于MyCat1.6正式版的源码修改的,支持subTables的按月分表正则配置 subTables=“ tableName_$201701-?” subTableWay="BYMONTH" 表示从201701月份开始进行分表处理,?表示当前日期的月份,是动态的。只需配置开始...
Python与MySQL分表分库实战,压缩包文件,欢迎下载。11
资源里包含SQL文档:创建数据库和存储过程.sql 生成数据.sql 测试.sql ...适合初学分表者使用。 数据按照每个月创建一个数据表,通过存储过程输入参数,按照指定日期跨表查询数据,并且可以分页查询。
分表 JAVA 分表例子,带SQL文件 很简单的例子,就可以明白怎么分表。
MySQL分表及分表后插入sql语句,表为订单表,可以参考一下
以前自己写的一套mysql分库分表的查询代码,查询速度大概在1300-Mysql_Query_By_Aspect
SQL,大数据分表,SQL千万级分表,删除百万数据
数据库分库分表 数据库分库分表 数据库分库分表