欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

HSQLDB 文件 变大 优化处理

程序员文章站 2022-05-24 18:16:27
...
HSQLDB 数据文件变大优化处理

 


1.问题
  hsqldb在频繁的增删改后,删除数据占据的空间并没有释放,我称之为空闲空间,data文件大小默认是不会变化的,随着时间的跨越,data文件会不断变大,默认hsqldb data文件上限是2G,这个是由于hsqldb是由纯java开发,读取文件的一个上限吧,达到这个上限,hsqldb就无法启动,问题就随之产生。

2.解决办法
  (1)用SQL执行SHUTDOWN COMPACT
      弊端:此种方式会回收空闲空间,但同时也会停止掉hsqldb服务,此种方式在需要hsqldb服务一直开启的应用中不可取
   (2)用SQL执行CHECKPOINT DEFRAG(亲自实践可行
      推荐理由:此种方式立即回收空闲空间,而且不会关闭hsqldb服务
   (3)在配置文件***.script文件中设置SET CHECKPOINT DEFRAG 200;
       解释:当空闲空间大小达到200M的时候开始回收,具体大小可以自行更改

3.建议
  个人建议把回收空间的处理放入quartz定时调度任务中,比如每日晚上11点或者每周一或者每月起始日开始回收空间,具体时间可以由cron表达式设置,根据个人项目中data文件大小达到2G的时间跨越而定。

4.代码
    (1)在spring-service.xml中增加bean配置 
    

	<bean id="hsqldbService"
		class="com.***.***.***.client.service.impl.HsqldbServiceImpl"
		autowire="byName">
	</bean>

 
    (2)在spring-job.xml中增加调度配置 
   

	<bean id="hsqldbCheckpointDefragJob"
		class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
		<property name="targetObject" ref="hsqldbService" />
		<property name="targetMethod" value="checkpointDefrag" />
	</bean>
	<bean id="hsqldbCheckpointDefragTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
		<property name="jobDetail" ref="hsqldbCheckpointDefragJob" />
		<property name="cronExpression" value="0 0 3 * * ?" /><!-- 每天凌晨3点执行一次碎片回收 -->
	</bean>
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
		<property name="triggers">
			<list>
				<ref bean="hsqldbCheckpointDefragTrigger" />
			  </list>
		</property>
	</bean>

 
    (3)HsqldbServiceImpl代码

   

public interface HsqldbService {
	/**
	 * recovery free space in hsqldb
	 */
	public void checkpointDefrag();
}

    

public class HsqldbServiceImpl implements HsqldbService {
	/**
	 * recovery free space in hsqldb
	 */
	@Override
	public void checkpointDefrag() {
		 Connection conn = null;
	        Statement stmt = null;
	        try {
				Class.forName("org.hsqldb.jdbcDriver");
				conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:9001/hsqldbname","sa", "");
				stmt = conn.createStatement();
				stmt.execute("CHECKPOINT DEFRAG");
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}finally{
				try {
					if (stmt!=null) {
						stmt.close();
					}
					if (conn!=null) {
						conn.close();
					}
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
	}
}

 
5.附件为HSQLDB中文手册