我正在使用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,那么它可以工作!
答案 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
参数,只有少数情况下您不需要它。通常这是该方法应具有的行为:
setFetchSize()
方法