Java Apache Solr-在执行增量导入命令时等待sql查询

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

我使用的是PostgreSQL 8.2.9、Solr 3.1和Tomcat 5.5

我有以下问题:
当我执行delta import-/dataimport?命令=delta import时,对数据库的任何更新查询在大约30秒内都没有响应

我可以很容易地重复这种行为(使用psql或hibernate):

PSQL:

  • 执行增量导入
  • 立即在psql中运行SQL查询:“更新表集…”。。。其中id=1;'好几次
  • 第二个/第三个/。。。时间-我必须等待30秒才能返回查询
  • 休眠

  • 在日志中-hibernate在设置查询参数后,在方法“doExecuteBatch(…)”上等待约30秒
  • 当我测试这个时,不会执行其他查询。另一方面,当我执行其他命令(如完全导入等)时,一切都很好。

    在Solr的dataconfig.xml中:

    • 在PostgreSQL数据源上,我将readOnly属性设置为true
    • deltaImportQuery,deltaQuery。。。实体上的标记不锁定数据库(简单选择)
    Web应用程序(使用hibernate)日志:

    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
    
    没有“选择”选项。。。用于上述日志中的更新/锁定/等查询

    我已经为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