2013-03-12 4 views
4

Я написал приложение, которое могут использовать серверы. Это приложение собирает информацию и отправляет ее на сервер. Это делается каждые 10 секунд. Объем данных зависит от игроков, играющих, но позволяет хранить его примерно на 50 серверах, каждый из которых отправляет 100 единиц данных (5000 всего каждые 10 секунд).Массовые обновления MySQL

Эти фрагменты данных содержат запрос SQL (в синтаксисе PreparedStatement), значения значений для SQL-запроса и идентификатор сервера.
Теперь я хочу обработать все данные. И это то, что не подходит для меня. У меня есть сервер MySQL, который имеет 5 таблиц. Три таблицы постоянно обновляются и не могут идти в ногу с потоком данных. Таблицы представляют собой таблицы InnoDB, в основном, поскольку я могу блокировать на уровне строк таким образом, а не за столом. Большинство запросов - UPDATE запросов в любом случае, всего лишь INSERT операторов.

Я попытался выполнить все запросы сразу, что только привело к ужасной производительности, так как серверу связи также пришлось дождаться, когда это будет завершено.
Я также попытался поставить все запросы в большом ConcurrentLinkedQueue и опорожнять эту очередь каждые несколько секунд. Производительность была лучше, но это было слишком медленно.
Затем я попробовал решение для каждого стола, которое было немного лучше. Слишком медленно.
В настоящее время он использует настройку для каждого сервера (создает новый thread для каждого сервера и выполняет все запросы там). Это все еще слишком медленно. Он не может идти в ногу.

Как вы видите, я пробовал много вещей. Я также пробовал использовать addBatch(), а затем executeBatch(), который также используется в текущей настройке. Конечно, я также смотрел здесь, Google и т. Д. Имеет полезную информацию, но в основном это просто добавление PreparedStatements и использование BatchUpdates.

Любые идеи о том, как это сделать?

+1

Посмотрите на предложения и здесь: http://dev.mysql.com/doc /refman/5.5/ru/optimizing-innodb-bulk-data-loading.html – mellamokb

+0

Что значит процесс? Вы можете обрабатывать объекты? – Hituptony

+0

Есть ли чтение в одно и то же время или вы действительно просто заинтересованы в получении данных прямо сейчас? – WPrecht

ответ

1

Я использовал spring-jdbc, и я использую com.jolbox.bonecp для соединений. Я хотел бы рекомендовать вам использовать его.

Я использую jdbcTemplate.batchUpdate(query, multyPreparedValues) где multyPreparedValues ​​ является List<Object[]>

, но вы также можете использовать BatchPreparedStatementSetter - пример https://stackoverflow.com/a/8873528/814304

Смежные вопросы