HSQLDB 文件 变大 优化处理 博客分类: HSQLDB hsqldb文件变大
程序员文章站
2024-03-22 22:12:58
...
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中文手册