Solr DataImportHandler - batchSize =“ - 1”不起作用

时间:2017-03-24 14:29:47

标签: apache solr dataimporthandler

我正在使用Apache Solr 6.4.1。 因为我使用的是一个非常大的数据库(超过3十亿行),所以我想在db-data-config.xml中添加batchSize =“ - 1”。

但如果我这样做,它确实有效。如果没有batchSize,我可以获得前2k行而不是“java.lang.RuntimeException:java.lang.StackOverflowError”错误。

在Solrconfig.xml中

<requestHandler name="/dataimport" class="solr.DataImportHandler">
<lst name="defaults">
  <str name="config">db-data-config.xml</str>
</lst>

在db-data-config.xml

<dataConfig>
  <dataSource type="JdbcDataSource"
          driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
          url="jdbc:sqlserver://***:1433;integratedSecurity=true;
          Initial Catalog=***;"
          batchSize="-1"/>
...

为什么batchSize =“ - 1”不工作? (batchSize =“200”或其他正在运行)

更新 如果我将Dataimporthandler中的Debug设置为false,那么它可以工作!

1 个答案:

答案 0 :(得分:0)

我不认为将batchSize设置为&#39; -1&#39;会对你的情况有所帮助。这是写在source code of Solr DataImportHandler

if (batchSize == -1)
  batchSize = Integer.MIN_VALUE;

  [... omissis ...]

Statement statement = c.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
statement.setFetchSize(batchSize);

因此请仔细检查哪种参数接受MS JDBC driver for the setFetchSize方法。

  

setFetchSize - 为JDBC驱动程序提供行数提示   当需要更多行时应该从数据库中获取   由此生成的ResultSet个对象   Statement。如果指定的值为零,则提示   被忽略了。默认值为零。

所以驱动程序可以自由地忽略这个提示,可能只是在整个表中读取。您还可以尝试更改JDBC驱动程序的版本......

我认为您首先应根据网络延迟和每次往返时想要检索的记录数量来调整值。

索引性能和mssql服务器负载取决于batchsize。尝试从小尺寸开始,然后逐渐增加它。

如果这不起作用,请尝试从根本上更改JDBC驱动程序。

返回batchSize参数,只有少数情况下您不需要它。通常这是该方法应具有的行为:

  • 如果您已将JVM配置为具有足够的内存来读取整个表
  • 如果您的JDBC驱动程序会引发调用setFetchSize()方法
  • 的异常
  • 如果您正在处理具有已知错误的 MySql JDBC驱动程序