#java #sqlite #ignite #database-backups #change-data-capture
Вопрос:
У нас есть система событий, создающая события базы данных для сбора данных об изменениях.
Система отправляет событие, содержащее инструкцию INSERT или UPDATE с ?
заполнителями и массивом упорядоченных значений, соответствующих каждому вопросительному знаку.
Я хочу использовать это для часового резервного копирования файлов, поэтому, если я получу такое заявление, как:
insert into T0(a,b,c) VALUES(?,?,?)
с массивом значений 1
, 2
а it's his
затем я записываю строку a в файл резервной копии за этот час как
insert into T0(a,b,c) VALUES(1,2,'it's his');
Несколько вещей:
- Это только строки, которые нуждаются в побеге? У нас нет или не разрешены двоичные столбцы
- Существует ли библиотека Java, которая уже может это сделать (из экосистемы Spring, Apache или как-то иначе)?
- Я видел код JDBC Postgres для побега https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java — этого достаточно?
Я также думал о создании базы данных SQLite на каждый час, записи в SQLite, а затем сбросе ее в hr.sql
текстовый файл. Это имеет то преимущество, что позволяет извлечь выгоду из всей тяжелой работы и мыслей, уже вложенных в обработку SQLite, но кажется излишним, если есть способ выполнить строку toString в Java, а затем добавить строку в файл.
При использовании SQLite также учитывается производительность, что усиливает мои сомнения в выборе этого маршрута.
Комментарии:
1. JDBC уже обрабатывает побег. Проверьте подготовленное заявление .
2. Однако я не хочу выполнять подготовленный оператор, я хочу сериализовать его в строку. Я пропустил API в подготовленном классе операторов для этого? Насколько я знаю, обычно ты звонишь
executeUpdate
или что-то в этом роде…Это не то, чего я хочу. Запрос уже отправляется в базу данных, которая будет его обрабатывать. Это решение для резервного копирования за пределами БД…поскольку в нем нет решения, поддерживающего то, что мы хотим делать с резервными копиями.
Ответ №1:
Нашел несколько вариантов.
Драйвер Postgres JDBC — это https://github.com/pgjdbc/pgjdbc/blob/master/pgjdbc/src/main/java/org/postgresql/core/Utils.java и другие импл. еще проще https://github.com/p6spy/p6spy/blob/master/src/main/java/com/p6spy/engine/common/Value.java#L172 буквально делаю
ESPECIAL_CHARACTER_PATTERN.matcher(stringValue).replaceAll("''")
Где private static final Pattern ESPECIAL_CHARACTER_PATTERN = Pattern.compile("'");
В обоих случаях это нужно только строкам, как я и думал, и двоичный файл обрабатывается отдельно, но у нас нет/нужен двоичный файл.
Копая дальше, я заново открыл ESAPI https://github.com/ESAPI/esapi-java-legacy У них есть библиотека для выхода из SQL https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html#defense-option-4-escaping-all-user-supplied-input