Как вы можете сделать удаленное соединение MySQL быстрее?
У меня есть Java-приложение, которое анализирует файлы и сохраняет нужные мне данные в базе данных SQLite.
Я пытаюсь сохранить данные в удаленной базе данных MySQL, которая вместо этого находится на сервере моего хоста.
Я переписал запросы, которые имели другой синтаксис, но у меня все еще есть проблема: это происходит намного медленнее, чем когда я делаю это локально, используя базу данных SQLite. Это то, с чем мне приходится жить, так как один локальный, а другой удаленный, или мне нужно знать что-то, прежде чем продолжить?
Например, синтаксический анализ 636 файлов и сохранение всех необходимых мне данных (некоторые данные бесполезны, я должен отсортировать их и т. Д.) Занимает 2,5 минуты, когда я использую базу данных SQLite. Это примерно 4,24 файла в секунду. В среднем это занимает около 15 секунд на файл, когда я использую базу данных MySQL, поэтому это займет примерно в 63 раза больше времени при использовании базы данных MySQL.
Я думаю, что основная проблема может быть, но я не знаю, как ее решить: каждый файл имеет в среднем 190 вставок. Так как файлы представляют собой статистические таблицы для боулинг-центра, и каждая игра представляет собой ряд (60 игроков на лигу, умноженный на 3 игры), плюс некоторые проверки, чтобы увидеть, существует ли лига в таблице лиг, расписании и т. Д., Я не могу на самом деле просто делайте меньше вставок, так как вся информация важна.
Я думаю, что это очень помогло бы, если бы я мог сгруппировать все вкладыши для игровой части в одну большую вставку, но я понятия не имею, возможно ли это / как это возможно / если оно того стоит или проблема в другом месте.
Я хотел бы знать, нахожусь ли я по крайней мере на правильном пути, или мне нужно привыкнуть к своему приложению, требующему столько времени для хранения данных, так как оно подключено удаленно.
1 ответ
Поскольку никто не ответил с ответом и что я нашел что-то, что я мог бы сделать, чтобы улучшить производительность, я опубликую это здесь, чтобы люди могли использовать это в будущем, если, как и я, они не знали о партиях.
Я использовал PreparedStatement
s (но обычные операторы работали бы так же) и вместо того, чтобы делать обычные ps.executeUpdate();
чтобы выполнить мои запросы, я использовал ps.addBatch();
между разными запросами, а затем ps.executeBatch();
когда я закончил строить запросы и хотел сделать одну большую вставку со всем в пакете.
Обратите внимание, что при этом, если ваше соединение называется conn
, ты должен сделать conn.setAutoCommit(false);
перед началом партии и conn.commit();
после ps.executeBatch();
, Затем вы можете установить autoCommit обратно в true после этого, если хотите.