При использовании JDBC для подключения к базе данных MySQL для введения данных, особенно большие партии данных непрерывно вставляются (100 000). Как повысить эффективность?
В интерфейсе программирования JDBC есть два метода утверждения, которые особенно заслуживают внимания:
Пакетная обработка данных может быть достигнута с помощью addBatch() и executeBatch() .
Тем не менее, стоит отметить, что сначала вам нужно настроить ручной коммит в ссылке базы данных, connection.setAutoCommit(false) , а затем выполнить connection.commit() после выполнения оператора.
Импорт java.io.bufferedReader; импорт java.io.ioexception; import java.sql.drivermanager; импорт java.sql.preparedstatement; импорт java.sql.sqlexcept db_test (param1, param2, param3, param4, param5) значения (?,?,?,?,?) "; частная строка charset = "utf-8"; Private String Connectstr = "jdbc: mysql: // localhost: 3306/test"; private String username = "root"; Private String Password = "123456"; private void dostore () Throws ClassNotFoundException, SQLexception, ioException {class.forname ("com.mysql.jdbc.driver"); ConnectStr += "? ingesErverPrepStmts = false & rewriteBatchedStatements = true"; // Вот тест для эффективной пакетной вставки, и нормальная пакетная вставка удаляется после выполнения подключения conn = (соединение) DriverManager.getConnection (ConnectStr, Userme, пароль); conn.setautocommit (false); // Установить ручное представление int count = 0; Подготовленное Statatement PSTS = Conn.PrePareStatement (SQL); String line = null; Дата начала = новая дата (); for (int i = 0; i <= 100000; i ++) {psts.setString (1, i+"param1"); psts.setstring (2, i+"param2"); psts.setstring (3, i+"param3"); psts.setstring (4, i+"param4"); psts.setstring (5, i+"param5"); psts.addbatch (); // Добавить график обработки пакетов ++; } psts.executebatch (); // Выполнить пакетную обработку conn.commit (); // отправить дату конец = новая дата (); System.out.println ("Количество ="+count); System.out.println ("runtime ="+(end.gettime ()-begin.gettime ())); conn.close (); } public static void main (string [] args) {try {new mysqlbatchutil (). dostore (); } catch (classnotfoundexception e) {e.printstacktrace (); } catch (sqlexception e) {e.printstacktrace (); } catch (ioException e) {e.printstackTrace (); }}}Результаты теста:
Количество = 100001
Время работы = 4725
В общей сложности 10 Вт, и время исполнения занимает 47 секунд.
Эта эффективность все еще не высока и, по -видимому, не достигает желаемого эффекта и требует дальнейшего улучшения.
Параметры также могут быть добавлены в строку соединения MySQL JDBC.
rewriteBatchedStatements = true
MySQL по умолчанию отключил пакетную обработку, и она включена через этот параметр. Этот параметр может быть переписан оператором SQL, представленным в базу данных.
Использование SERVERPREPSTMTS = false
Если он не включен (userverprepstmts = false), используйте com.mysql.jdbc.preparedStatement для локальной сборки SQL и, наконец, отправьте его в DB. Это последний SQL, который был заменен.
Вот небольшое улучшение, добавьте следующее оператор в строку подключения (удалите комментарии в конструкторе кода):
ConnectStr += "? userVerPrepStmts = false & rewriteBatchedStatements = true";
Результаты теста следующие:
Количество = 100001
Время работы = 1213
С таким же количеством данных, на этот раз для выполнения потребовалось всего 12 секунд, что показывает, что эффективность обработки была значительно улучшена. Хаха
Вышеупомянутое эффективность теста использования JDBC для вставки 10 Вт деталей данных в партии базы данных MySQL. Я надеюсь, что это будет полезно для всех. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит всем вовремя. Большое спасибо за вашу поддержку сайту wulin.com!