Самый быстрый способ вставить в MySQL в Java - PullRequest
1 голос
/ 15 ноября 2011

У меня есть конечная точка службы, которая в основном вставляет некоторые данные в MySQL.Я ищу самый быстрый способ вставить строку в mysql.

Я не возражаю, если она очень многословна или требуется больше времени для внесения изменений (по сравнению, скажем, с использованием спящего режима) в качестве области действияэтот сервлет очень минимален, но производительность на самом деле является главным приоритетом.

Я новичок в java / servlets, поэтому, пожалуйста, не оставляйте подробностей и не думайте о многом с моей стороны.

Ответы [ 6 ]

4 голосов
/ 15 ноября 2011

Возможно, самый быстрый способ - использовать драйвер JDBC напрямую и написать SQL самостоятельно. Вот пример кода, который мне подходит: http://www.roseindia.net/jdbc/jdbc-mysql/InsertValues.shtml

Люди используют Hibernate по многим причинам. Помимо упрощения сопоставления классов с таблицами базы данных, он также обрабатывает кэширование, пул соединений и тому подобное. Открытие нового соединения с базой данных занимает много времени, поэтому вам придется самостоятельно реализовывать подобные вещи, чтобы заставить ваш сервлет работать хорошо.

2 голосов
/ 15 ноября 2011

Существует сравнение скоростей вставки с использованием JDBC и различных методов.Это для PostgreSQL, но подход и результаты будут аналогичными для MySQL: http://rostislav -matl.blogspot.com / 2011/08 / fast-insertts-to-postgresql-with-jdbc.html .

Вкратце: использовались пакетные вставки (поддерживаются, вероятно, в любом драйвере JDBC) и, где возможно, учитывайте COPY FROM.

2 голосов
/ 15 ноября 2011

Самый быстрый способ - через пакетные вставки JDBC:

http://www.roseindia.net/jdbc/Jdbc-batch-insert.shtml

0 голосов
/ 16 ноября 2011

Если вы вставляете только одну строку, простая вставка, возможно, подготовленный запрос, скорее всего, будет самой быстрой.Используйте пул соединений, чтобы вам не приходилось каждый раз подключаться, и в базе данных есть параметры настройки, которые будут иметь значение.

Если вы можете избежать неприятностей, я бы предложил не вставлять данные в сервлет, а просто поместить данные в очередь памяти, которая вставляется в базу данных другим потоком.Вы не будете знать, удалось ли это или нет в ответе сервлета, все же.

http://dev.mysql.com/doc/refman/5.0/en/innodb-tuning.html http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

0 голосов
/ 15 ноября 2011

Если вы не используете JPA, я рекомендую использовать JdbcTemplate из Spring (даже если вы не используете Spring в противном случае) для управления соединениями (их закрытие и т. Д.)

Использовать PreparedStatements.

Не инициализируйте драйвер / соединения напрямую.Вместо этого используйте объединенный источник данных, настроенный на вашем сервере приложений (вы можете внедрить его с помощью @Resource).

Использовать EJB для управления транзакциями.

0 голосов
/ 15 ноября 2011

Обязательно используйте пул соединений или что-то подобное.Это, безусловно, самый большой фактор.

Также может помочь использование PrepraredStatement, которое фактически сохраняется в запросах сервлета, чтобы избавить MySQL от анализа запроса каждый раз.

Оба вместеможно реализовать, просто сохранив соединение с БД, а также PreparedStatement в ThreadLocal, но это предполагает, что контейнер сервлета использует пул потоков.

Обновление: c3p0 , очевидно, реализует как соединение, так и пул операторов, так что я бы просто использовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...