Java Apache Solr-在执行增量导入命令时等待sql查询
我使用的是PostgreSQL 8.2.9、Solr 3.1和Tomcat 5.5 我有以下问题:Java Apache Solr-在执行增量导入命令时等待sql查询,java,sql,database,solr,locking,Java,Sql,Database,Solr,Locking,我使用的是PostgreSQL 8.2.9、Solr 3.1和Tomcat 5.5 我有以下问题: 当我执行delta import-/dataimport?命令=delta import时,对数据库的任何更新查询在大约30秒内都没有响应 我可以很容易地重复这种行为(使用psql或hibernate): PSQL: 执行增量导入 立即在psql中运行SQL查询:“更新表集…”。。。其中id=1;'好几次 第二个/第三个/。。。时间-我必须等待30秒才能返回查询 休眠: 在日志中-hibernat
当我执行delta import-/dataimport?命令=delta import时,对数据库的任何更新查询在大约30秒内都没有响应 我可以很容易地重复这种行为(使用psql或hibernate): PSQL:
在Solr的dataconfig.xml中:
- 在PostgreSQL数据源上,我将readOnly属性设置为true
- deltaImportQuery,deltaQuery。。。实体上的标记不锁定数据库(简单选择)
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
没有“选择”选项。。。用于上述日志中的更新/锁定/等查询
我已经为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
Jan 11 14:33:07测试博士后[26201]:[3-1]日志:执行:将会话特征设置为事务只读
Jan 11 14:33:07 test postgres[26201]:[4-1]日志:执行:将会话特征设置为事务隔离级别读取未提交
为什么会这样?这看起来像某种数据库锁,但为什么导入完成后(2秒)查询仍在等待(30秒)?执行前等待SELECT语句完成的更新。据我所知,你对此无能为力。我们通过分批编制索引来解决这个问题。多个SELECT语句可以,但UPDATE和DELETE会影响记录,并且在锁定表之前不会执行。确定。很难找到解决这个问题的办法 原因是底层平台-磁盘写入饱和。太多的小“磁盘写入”消耗了所有磁盘写入功率 现在,我们与服务层提供商达成了新协议 测试查询:
while true ; do echo "UPDATE table_name SET type='P' WHERE type='P'" | psql -U user -d database_name ; sleep 1 ; done
再加上通过其他应用程序进行更改,再加上同时更新索引
这是在平台变更之前:
下面是它现在的工作原理:
while true ; do echo "UPDATE table_name SET type='P' WHERE type='P'" | psql -U user -d database_name ; sleep 1 ; done