Hibernate如何实现自动分表以及查询问题?

Jwxl 发布于 2017/11/03 17:48
阅读 354
收藏 0

有个需求,服务器部分日志需要存入数据库,用于统计分析.数据量有点大,打算按照日志时间每日分表,保留半年内数据. 重点是按照日期分表.

我用mybatis实现了一个分表逻辑,用法就是替换表名.

插入数据很简单

然后搜索时是基于时间段来查询的,如

	public List<CurLog> selectList(int start, int end) {
		// 分表查询就蛋疼了....
		int beginOfDay = TimeKit.getZeroOfDay(start);//转换为当日0点
		int endOfDay = TimeKit.getZeroOfDay(end);//转换为当日0点

		// 下面判断查询的到底是那几天
		IntList existDate = new IntList();
		IntList tableDateCache = getTableDateCache();
		//tableDateCache缓存了当前服务器已经存在的表的日期,因此下面简单判断哪些有就行了
		for (int t = beginOfDay; t <= endOfDay; t += PubConst.day) {
			if (tableDateCache.indexOf(t) >= 0) {
				existDate.add(t);
			}
		}

		// 然后分批去查询每张表
		List<CurLog> result = new ArrayList<>();
		for (int tableDate : existDate.toArray()) {
			String tableName = tableName(tableDate);//根据日期算出表名
			Collection<CurLog> logs = selectList(tableName, start, end);
			if (logs != null) {
				result.addAll(logs);
			}
		}
		// 返回结果
		return result;
	}
	public Collection<CurLog> selectList(String tableName, int start, int end) {
		SqlSession session = sqlSessionFactory.openSession();
		try {
			CurLogMapper mapper = session.getMapper(CurLogMapper.class);
			Collection<CurLog> logs = mapper.selectCur(tableName, start, end);
			return logs;
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		} finally {
			session.close();
		}
	}

下面是Mapper

// 查询
	@Select("select * from #{tableName} where logTime>=#{startTime} and  logTime<#{endTime}")
	public List<CurLog> selectCur(@Param("tableName") String tableName, @Param("startTime") int start,
			@Param("endTime") int end);

 

现在我想用Hibernate来实现,发现这个任务有点艰巨....完全没路子啊!

哪位大神给点建议?

加载中
0
wooflo
wooflo
sql层就能实现了 分区表 以日期为分区
0
R-Lu
R-Lu

为什么不按照数据库层直接按日分区。

返回顶部
顶部