Apache Solr - ожидание SQL-запросов при выполнении команды delta-import - PullRequest
0 голосов
/ 08 января 2012

Я использую PostgreSQL 8.2.9, Solr 3.1, Tomcat 5.5

У меня следующая проблема:Когда я выполняю delta-import - / dataimport? Command = delta-import - любые запросы на обновление базы данных не отвечают в течение 30 секунд.

Я могу легко повторить это поведение (используя psql или hibernate):

PSQL:

  1. Выполнение дельта-импорта
  2. Сразу же в psql - выполнить SQL-запрос: 'UPDATE table SET ... WHERE id = 1;»несколько раз
  3. Второй / третий / ... раз - я должен ждать ~ 30 секунд, пока запрос не вернется

Hibernate :

  1. В журналах - hibernate ожидает ~ 30 секунд для метода 'doExecuteBatch (...)' после установки параметров запроса

Никакие другие запросы не выполняются, когда я проверяю это.С другой стороны, когда я выполняю другие команды (например, полный импорт и т. Д.) - все работает отлично.

В dataconfig.xml от Solr:

  • У меня readOnly установлен в true для источника данных PostgreSQL.
  • deltaImportQuery, deltaQuery, ..на тегах сущностей не блокируют базу данных (простые SELECT)

Журналы веб-приложений (использующие спящий режим):

2012-01-08 18:54:52,403 DEBUG my.package.Class1... Executing method: save
2012-01-08 18:55:26,707 DEBUG my.package.Class1... Executing method: list

Журналы Solr:

INFO: [] webapp=/search path=/dataimport params={debug=query&command=delta-import&commit=true} status=0 QTime=1
2012-01-08 18:54:50 org.apache.solr.handler.dataimport.DataImporter doDeltaImport
INFO: Starting Delta Import
...
2012-01-08 18:54:50 org.apache.solr.handler.dataimport.JdbcDataSource$1 call
INFO: Time taken for getConnection(): 4
...
FINE: Executing SQL: select ... where last_edit_date > '2012-01-08 18:51:43'
2012-01-08 18:54:50 org.apache.solr.core.Config getNode
...
FINEST: Time taken for sql :4
...
INFO: Import completed successfully
2012-01-08 18:54:50 org.apache.solr.update.DirectUpdateHandler2 commit
INFO: start commit(optimize=true,waitFlush=false,waitSearcher=true,expungeDeletes=false)
2012-01-08 18:54:53 org.apache.solr.core.Config getNode
...
2012-01-08 18:54:53 org.apache.solr.update.DirectUpdateHandler2 commit
INFO: end_commit_flush
...
2012-01-08 18:54:53 org.apache.solr.handler.dataimport.DocBuilder execute
INFO: Time taken = 0:0:2.985

Там нет «ВЫБРАТЬ ... ДЛЯ ОБНОВЛЕНИЯ / LOCK / и т. Д."запросы в журналах выше.

Я установил ведение журнала для PostgreSQL - там нет блокировок.Даже сеансы установлены на:

Jan 11 14:33:07 test postgres[26201]: [3-1] <26201> LOG:  execute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION READ ONLY
Jan 11 14:33:07 test postgres[26201]: [4-1] <26201> LOG:  execute <unnamed>: SET SESSION CHARACTERISTICS AS TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

Почему это происходит?Это похоже на какую-то блокировку базы данных, но почему тогда, когда импорт завершен (2 секунды), запросы все еще ждут (в течение 30 секунд)?

Ответы [ 2 ]

0 голосов
/ 18 апреля 2012

Хорошо. Трудно было найти решение этой проблемы.

Причиной была базовая платформа - насыщение записи на диск. Было слишком много маленьких записей на диск, которые потребляли всю мощность записи на диск.

Теперь у нас есть новое соглашение с нашим провайдером уровня обслуживания.

Тестовый запрос:

while true ; do echo "UPDATE table_name SET type='P' WHERE type='P'" | psql -U user -d database_name ; sleep 1 ; done 

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

Это было до смены платформы: Before platform change

А вот как это работает сейчас: enter image description here

0 голосов
/ 11 января 2012

Обновление, ожидающее завершения инструкции SELECT перед выполнением.Не много вы можете сделать с этим, что я знаю.Мы решаем эту проблему, выполняя нашу индексацию партиями.Несколько операторов SELECT хороши, но UPDATE и DELETE влияют на записи и не будут выполняться до тех пор, пока не смогут заблокировать таблицу.

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