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.伸缩性.
降低数据库存储压力:
分表:整个库的数据量不是很大,但是某个(些)表的数据量较大.
相关推荐
NULL 博文链接:https://houjiang2100.iteye.com/blog/972641
基于spring+hibernate 实现的分表插件,可以定义分表策略,本代码只提供一个思路,具体的实现逻辑还是要基于具体的业务开发,重复造轮子并不可耻,出了问题大不了重造
水平拆分数据分库和分表的核心问题是表的ID唯一,然后根据唯一的ID映射到一个物理存储位置,这个映射方案要考虑到满足数据量暴增线性扩展和业务上容易保持一致,本文主要讨论分库分表如何映射的问题。
主要介绍了超大数据量存储常用数据库分表分库算法总结,本文讲解了按自然时间来分表/分库、按数字类型hash分表/分库、按md5值来分表/分库三种方法,以及分表所带来的问题探讨,需要的朋友可以参考下
比较完善的大量数据分表功能代码,包含创建数据库、生成数据、测试结果。适合初学分表者使用。 数据按照每个月创建一个数据表,通过存储过程输入参数,按照指定日期跨表查询数据,并且可以分页查询。
一个简单的oracle数据库环境下的存储过程,介绍了如何从带年月人的分表取数据
① 创建数据库 ② 在创建的数据库中添加文件组 ③ 在文件组中添加新的文件 ④ 定义分区函数 ⑤ 定义分区架构 ⑥ 定义分区表 ⑦ 定义代理作业,自动添加分区分割点 ⑧ 测试数据
kettle对数据分表插入 数据库Oracle etl工具 kettle 通过java脚本,hash算法,实现分表数据写入
spring动态数据源整合mybatis实现的分库分表操作。 分库分表对业务代码是透明的,只需要在配置文件分配分库模版即可动态的实现分库分表的增删改查操作。
不同的数据库写在对应的包名下分别进行扫描, 通过对id的取模运算实现分表的能力, 此代码仅只是提供思路,具体的实现方案还需要完善
在工作中,对于Excel的繁杂数据处理,不管你的数据有多乱,Ta将助你一臂之力.使用非常简单,只需按住ALT+F11后,新建一个窗体和一模块,在把相应的代码复制进去运行就有结果了.....
利用python进行数据表分表,目的是将一个大的excel文本按照规则生成对应的小文件
下面小编就为大家带来一篇spring hibernate实现动态替换表名(分表)的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
- 产品上线以后,数据量越来越大,当一个表有几十万上百万条记录的时候,是时候考虑分表了。【超过几千万记录的话,这个分表估计不适合。】 - 怎么做 - 分表情况,1:hash分表,按照目标表的id的hash值,写入对应...
通过使用sharding-jdbc分库分表,以及多数据源的切换
基于hibernate的mysql分表分库实例-mysql-cluster-hibernate
SQL,大数据分表,SQL千万级分表,删除百万数据
这是一份康盛数据分表的实现代码,支持自动分表,同时支持跨表跨范围定位数据。
sharind-jdbc样例,当中包含了按月动态分表,一个比较简单的demo,大家可以结合自己的需求进行修改,以及可以看下实现思路,仅供参考!
在MySQL中,当一张表的数据过大的时候,操作速度会变慢,而且给维护带来麻烦,分表设计的思想正好解决了这一问题。