我一直在尝试从Glassfish上运行的Java EE应用程序中创建derby数据库的备份。我试图使用StoredProcedureQueries来实现这一点,它可以在下面的方法中正常工作。
public Backup doBackup(String path) throws QueryTimeoutException {
StoredProcedureQuery query = em.createStoredProcedureQuery(
"SYSCS_UTIL.SYSCS_BACKUP_DATABASE");
query.registerStoredProcedureParameter(1, java.lang.String.class,
ParameterMode.IN);
query.setParameter(1, path);
query.execute();
}
但是我也想像cronjob一样自动创建备份。为此,我想我只是使用每n小时执行一次的ScheduledExecuterService。我为此写了以下方法:
public void startScheduledBackupRunner() {
long delay = 1;
Runnable backupRunner = () -> {
try {
doBackup("/foo/bar/");
} catch (PersistenceException e) {
logger.fatal(e);
}
};
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
scheduler.scheduleAtFixedRate(backupRunner, delay, delay, TimeUnit.HOURS);
}
backupRunner线程成功执行,它还调用doBackup()方法。但是在调用createStoredProcedureQuery()时似乎卡住了。如果重要的话我注入了EntityManager em:
@PersistenceContext
EntityManager em;
我错过了重要的事情吗?任何线索都非常感谢。
答案 0 :(得分:0)
好的,所以我找到了一个解决方案,它不涉及使用@Schedule
注释创建单独的线程。它没有解决潜在的问题,我仍然不知道为什么第一种方法不起作用,它只是另一种可能更优雅的方式来执行计划任务。