diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java index 09c6a6d4..4d8e5043 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBRepository.java @@ -55,7 +55,7 @@ public class HSQLDBRepository implements Repository { private static final Logger LOGGER = LogManager.getLogger(HSQLDBRepository.class); - private static final Object CHECKPOINT_LOCK = new Object(); + public static final Object CHECKPOINT_LOCK = new Object(); // "serialization failure" private static final Integer DEADLOCK_ERROR_CODE = Integer.valueOf(-4861); @@ -703,8 +703,11 @@ public class HSQLDBRepository implements Repository { private ResultSet checkedExecuteResultSet(PreparedStatement preparedStatement, Object... objects) throws SQLException { bindStatementParams(preparedStatement, objects); - if (!preparedStatement.execute()) - throw new SQLException("Fetching from database produced no results"); + // synchronize to block new executions if checkpointing in progress + synchronized (CHECKPOINT_LOCK) { + if (!preparedStatement.execute()) + throw new SQLException("Fetching from database produced no results"); + } ResultSet resultSet = preparedStatement.getResultSet(); if (resultSet == null) @@ -1056,4 +1059,4 @@ public class HSQLDBRepository implements Repository { return DEADLOCK_ERROR_CODE.equals(e.getErrorCode()); } -} \ No newline at end of file +} diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java index c1b6ee9b..acf24c54 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBSaver.java @@ -61,13 +61,15 @@ public class HSQLDBSaver { public boolean execute(HSQLDBRepository repository) throws SQLException { String sql = this.formatInsertWithPlaceholders(); - try { - PreparedStatement preparedStatement = repository.prepareStatement(sql); - this.bindValues(preparedStatement); + synchronized (HSQLDBRepository.CHECKPOINT_LOCK) { + try { + PreparedStatement preparedStatement = repository.prepareStatement(sql); + this.bindValues(preparedStatement); - return preparedStatement.execute(); - } catch (SQLException e) { - throw repository.examineException(e); + return preparedStatement.execute(); + } catch (SQLException e) { + throw repository.examineException(e); + } } }