`

Hibernate对于大数据量处理之分表

阅读更多

    Hibernate如何处理大数据量的操作呢?主要是数据分库或分表存放,从而提高软件的运行及数据库访问的速度。下面介绍一下对于日志存储的数据分表操作。

    日志管理
----------------
1.导航栏-->日志管理
2.LogAction.findAllLogs();
 public String findAllLogs(){
  this.allLogs = logService.findAllEntities();
  return "logListPage" ;
 }
3.
4.

日志:
 数据量大:
 1.分表(动态表).
 2.分库.

logs
logs_2013_1
logs_2013_2

使用调度器动态生成日志表
------------------------------
0.dao和service增加执行原生sql语句的功能.
 dao
 -----------------
 public interface BaseDao<T> {
  ...
  public void executeSQL(String sql,Object...objects);
 }

 public class BaseDaImpl<T> ...{
  ...
  //执行原生的sql语句
  public void executeSQL(String sql,Object...objects){
   SQLQuery q = sf.getCurrentSession().createSQLQuery(sql);
   for(int i = 0 ; i < objects.length ; i ++){
    q.setParameter(i, objects[i]);
   }
   q.executeUpdate();
  }
 }

 service
 -----------------------
 public interface BaseService<T> {
  ...
  public void executeSQL(String sql,Object...objects);
 }

 public abstract class BaseServiceImpl<T> implements BaseService<T> {
  ...
  //执行原生的sql语句
  public void executeSQL(String sql,Object...objects){
   dao.executeSQL(sql, objects);
  }
 }
1.引入quartz类库
 com.springsource.org.quartz-1.6.2.jar
2.创建石英任务
 /**
  * 使用spring集成的石英调度,动态生成日志表
  */
 public class GenerateLogsTableTask extends QuartzJobBean {

  //
  private LogService logService ;
  
  public void setLogService(LogService logService) {
   this.logService = logService;
  }

  /**
   * 执行任务
   */
  protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException {
   String tableName =  LogUtil.generateLogTableName(1);
   String sql = "create table if not exists " + tableName + " like logs";
   logService.executeSQL(sql);
   System.out.println(tableName + " 生成了! " );
   
   tableName =  LogUtil.generateLogTableName(2);
   sql = "create table if not exists " + tableName + " like logs";
   logService.executeSQL(sql);
   System.out.println(tableName + " 生成了! " );
  }
 }
3.配置调度任务
 [conf/schedules.xml]
 <?xml version="1.0"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
  <!-- 任务明细bean,对石英任务包装 -->
  <bean id="jobDetailBean" class="org.springframework.scheduling.quartz.JobDetailBean">
   <property name="jobClass" value="cn.itcast.surveypark.schedule.GenerateLogsTableTask" />
   <property name="jobDataAsMap">
    <map>
     <entry key="logService" value-ref="logService" />
    </map>
   </property>
  </bean>
  
  <!-- cron触发器bean,设置任务的调度策略的 -->
  <bean id="cronTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerBean">
   <property name="jobDetail" ref="jobDetailBean" />
   <!-- cron表达式 -->
   <property name="cronExpression">
    <value>0 0 0 15 * ?</value>
   </property>
  </bean>
  
  <!-- 调度器工厂bean,激活触发器,启动石英任务的 -->
  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
   <property name="triggers">
    <ref bean="cronTriggerBean"/>
   </property>
  </bean>
 </beans>
4.配置web.xml文件,一同加载spring的所有配置文件
 <!-- 通过上下文参数指定spring配置文件的位置 -->
 <context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:beans.xml,classpath:schedules.xml</param-value>
 </context-param>
5.修改时间,为触发任务接近的时间,比如2013-1-14 23:59:00秒
6.启动观察效果

使用spring监听器在服务器启动时完成当月日志表和下两个月日志表初始化
-------------------------------------------------------------------
 /**
  * 初始化日志表监听器
  */
 @SuppressWarnings("rawtypes")
 @Component
 public class IniLogTablesListener implements ApplicationListener{

  @Resource
  private LogService logService;
  
  public void onApplicationEvent(ApplicationEvent arg0) {
   //是否是上下文刷新事件
   if(arg0 instanceof ContextRefreshedEvent){
    String tableName = LogUtil.generateLogTableName(0);
    String sql = "create table if not exists " + tableName + " like logs";
    logService.executeSQL(sql);
    
    sql = "create table if not exists " + LogUtil.generateLogTableName(1) + " like logs";
    logService.executeSQL(sql);
    
    sql = "create table if not exists " + LogUtil.generateLogTableName(2) + " like logs";
    logService.executeSQL(sql);
    System.out.println("日志表-"+tableName+",初始化完成");
   }
  }
 }

可扩展性:scalable.伸缩性.

降低数据库存储压力:
 分表:整个库的数据量不是很大,但是某个(些)表的数据量较大.

分享到:
评论

相关推荐

    hibernate动态分表

    【hibernate动态分表】是一种数据库设计策略,主要用于处理大数据量的问题,通过将数据分散到多个物理表中,以实现水平扩展,提高查询效率,减轻单表的压力。在Java Web开发中,Hibernate作为一款流行的ORM(对象...

    hibernate-分表插件实现思路

    在IT行业中,数据库分表是一种常见的优化策略,用于解决大数据量带来的性能问题。本文将深入探讨如何使用Hibernate作为ORM框架,结合Spring,实现一个自定义的分表插件。这个插件提供了一种灵活的策略定义方式,适用...

    基于hibernate的mysql分表分库实例-mysql-cluster-hibernate.zip

    总之,"基于hibernate的mysql分表分库实例"是一个解决大数据量场景下的数据库管理问题的实践案例,它结合了Hibernate的ORM便利性和MySQL集群的高可用性,对于Java开发者来说,这是一个非常有价值的参考资料。...

    分库分表,多数据源的切换

    总之,分库分表和多数据源切换是解决大数据量场景下的重要手段。Sharding-JDBC作为优秀的开源框架,为开发者提供了便捷、高效、灵活的解决方案。通过学习和实践SSMDemo,我们可以更好地理解和掌握这一技术,从而优化...

    ShardingJDBC5.1.1按月分库分表、读写分离、自动创表完整demo

    ShardingJDBC作为一款轻量级的Java框架,能够有效地解决大数据量下的分库分表、读写分离等问题,提高系统的并发处理能力。本文将通过一个基于SpringBoot、Mybatis-Plus和Druid的数据源管理的完整示例,详细介绍如何...

    对分库分表的一些想法

    2. 分表:在单表数据量过大时,可以将一个大表拆分成多个小表,每个小表存储一部分数据。分表方式有哈希分表、范围分表和复合键分表等。哈希分表根据预定义的哈希函数将数据均匀分配到多个表;范围分表通常按时间或...

    【基于Maven的Hibernate整合Mycat示例】

    它帮助开发者理解如何在大型系统中处理高并发、大数据量的情况,以及如何通过Maven和Hibernate简化开发流程。通过深入学习和实践这个示例,开发者能够提升在Java Web领域的技术水平,为构建可扩展的分布式应用打下...

    hibernate完整学习

    Hibernate的本质 也是处理对象和关系模型之间的转换,只是对JDBC做了一层封装 优点: 1.... session.save(user);...如果一张表中有上亿级别的数据量,也不适合用hibernate(数据库读写分离,分库分表)

    Hibernate性能调优

    3. 查询缓存:适用于不变的查询结果,但更新操作需谨慎处理,防止缓存中的数据过期。 五、事务管理 1. 合理设置事务隔离级别,避免并发问题如脏读、不可重复读和幻读。 2. 使用Spring的声明式事务管理,简化事务...

    struts+hibernate上传下载图片

    Hibernate通过配置的映射文件(hbm.xml)将这些数据对象与数据库表对应,从而实现持久化。 在数据库中,通常会有一个专门用来存储图片信息的表,例如"image_info",包含字段如id(主键)、filename、upload_time、...

    shardingsphere 分库分表中文帮助文档

    Shardingsphere-JDBC 是 Shardingsphere 生态系统中的一个模块,它作为一个轻量级的 JDBC 扩展框架存在,能够无缝集成到任何基于 JDBC 的应用程序中,无需修改业务代码即可实现数据分片等功能。 - **特点**: - ...

    sharding-jdbc之——分库分表实例完整源码

    2. **分库分表原理**:分库分表是数据库水平扩展的一种策略,通过将一个大表的数据分散到多个数据库或表中,以减轻单一数据库的压力,提高系统的读写性能和并发能力。Sharding-JDBC提供了基于哈希、范围、精确匹配等...

    使用 ShardingSphere 实操MySQL分库分表实战.docx

    总的来说,ShardingSphere 为企业提供了强大的分布式数据库解决方案,通过分库分表等技术解决了大数据量和高并发场景下的数据库性能问题。然而,实施分库分表也带来了一些挑战,如事务一致性、规则设计和系统复杂性...

    当当开源sharding-jdbc-轻量级数据库分库分表中间件

    总之,Sharding-JDBC以其简单高效的设计理念、高度兼容性以及出色的性能表现,在数据库分库分表领域内占据了一席之地,对于需要解决大规模数据处理问题的企业来说,是一个值得关注和尝试的选择。

    hibernate分库的dome

    在IT行业中,数据库分库是一种常见的优化策略,用于解决单个数据库在高并发、大数据量场景下的性能瓶颈问题。Hibernate,作为Java领域广泛使用的对象关系映射(ORM)框架,虽然设计之初并未直接考虑分布式数据库的...

    springMvc Mybatis mysql 分库分表-shardingJdbc.zip

    在IT行业中,数据库扩展是解决高并发、大数据量场景下的重要技术之一。Spring MVC、MyBatis和MySQL是常见的Web开发框架与数据库系统,而ShardingJDBC则是阿里巴巴开源的一款分布式数据库中间件,用于实现数据库的分...

    xindou.rar_hibernate xml_xindou_电子商务_购物商城_购物网站

    此外,为了提高系统性能,可以考虑使用缓存技术如Redis,以及分库分表策略来应对大数据量的挑战。 综上所述,"xindou.rar"中的资源为我们展示了如何运用Hibernate和XML配置来构建一个功能完善的电子商务购物商城...

    Hibernate Envers.docx

    随着业务操作的频繁,审计表的数据量可能会迅速增加,这可能会带来性能和存储空间的问题。为解决这个问题,可以考虑以下策略: - 定期清理过期的审计记录,例如只保留最近一段时间内的审计数据。 - 使用分区或分表...

    Apache ShardingSphere 中文文档 分库分表

    总的来说,Apache ShardingSphere 是一个强大的分布式数据库解决方案,它提供了一套完整的工具集来管理和扩展数据库,帮助开发者轻松应对大数据量和高并发的挑战。无论是在 Java 还是 MySQL 的环境中,...

Global site tag (gtag.js) - Google Analytics