You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solr 7.2.1导入SQL Server百万数据仅10条,求配置排查

解决Solr DataImportHandler仅导入10条数据+SQL Server ASYNC_NETWORK_IO挂起问题

首先,咱们先从配置文件的明显语法错误入手,这些问题很可能是导致导入提前终止的直接原因:

1. 修复data.import.xml的语法问题

你的配置里有几处标签闭合和属性错误:

  • <entity结尾缺失闭合符号,应该写成</entity>
  • 根标签<dataConfig>结尾写成了<dataConfig>,正确闭合应为</dataConfig>
  • password="<<PASSWORD" 缺少闭合的双引号,需修正为password="<<PASSWORD>>"

修正后的data.import.xml示例:

<dataConfig> 
  <dataSource type="JdbcDataSource" driver="com.microsoft.sqlserver.jdbc.SQLServerDriver" 
              url="jdbc:sqlserver://<<SERVER>>;databaseName=<<DATABASE>>;" 
              user="<<USER>>" password="<<PASSWORD>>" /> 
  <document name="MY_DOCUMENT"> 
    <entity name="doc" query="SELECT * FROM MYTABLE"> 
      <field column='Field1' name='field1' /> 
      <field column='field2' name='field2' /> 
      ... 
    </entity>
  </document> 
</dataConfig>

2. 修正solrconfig.xml的lucene版本不匹配问题

你使用的是Solr 7.2.1,但luceneMatchVersion设置为6.0,版本不兼容可能导致字段处理、数据导入过程中出现隐性错误。请将其修改为与Solr版本一致的7.2.1:

<luceneMatchVersion>7.2.1</luceneMatchVersion>

接下来分析SQL Server的ASYNC_NETWORK_IO挂起错误:这个错误本质是SQL Server已准备好数据,但客户端(Solr)迟迟未接收完数据,导致连接挂起。结合仅导入10条数据的现象,核心原因是百万级数据一次性拉取的压力过大,再加上可能的驱动、内存配置问题。

3. 优化DataImportHandler的查询逻辑(核心解决方案)

百万条数据全量导入时,绝对不能用SELECT * FROM MYTABLE一次性拉取,会导致Solr内存溢出、数据传输卡顿。推荐采用分页导入的方式:

方式一:使用DIH自带的分页参数

在entity标签中添加分页配置,每次拉取固定行数(比如1000条):

<entity name="doc" 
        query="SELECT * FROM MYTABLE ORDER BY field1 OFFSET ${dataimporter.offset} ROWS FETCH NEXT 1000 ROWS ONLY"
        pagination="true" 
        rows="1000">
  <!-- 字段映射内容 -->
</entity>

这里使用SQL Server的OFFSET/FETCH语法分页,field1作为主键确保排序稳定。

方式二:基于主键的增量式全量导入(更可靠)

如果你的表有主键(比如field1),可以利用DIH的增量导入逻辑实现分批全量导入:

<entity name="doc" 
        query="SELECT * FROM MYTABLE"
        deltaQuery="SELECT field1 FROM MYTABLE WHERE 1=1" <!-- 全量时触发所有主键 -->
        deltaImportQuery="SELECT * FROM MYTABLE WHERE field1 = '${dataimporter.delta.field1}'"
        pk="field1">
  <!-- 字段映射内容 -->
</entity>

这种方式会将全量导入拆分为单个主键的查询,避免一次性拉取大量数据。

4. 检查JDBC驱动兼容性

确保你使用的SQL Server JDBC驱动适配Java 8和你的SQL Server版本:

  • 将适配的驱动jar(比如mssql-jdbc-6.4.0.jre8.jar)放到Solr的server/lib目录下
  • 避免使用过旧的驱动,旧驱动在处理大结果集时容易出现传输卡顿

5. 调整Solr的JVM内存

百万条数据导入需要足够的内存支撑,修改Solr的启动配置:

  • Linux:编辑solr.in.sh,修改JAVA_OPTS:
    JAVA_OPTS="-Xmx4g -Xms2g -XX:+UseG1GC"
    
  • Windows:编辑solr.in.cmd,修改set JAVA_OPTS:
    set JAVA_OPTS=-Xmx4g -Xms2g -XX:+UseG1GC
    

可根据服务器实际内存调整,一般至少分配2-4G堆内存。

6. 查看Solr日志定位隐性错误

到Solr的logs目录下打开solr.log,搜索dataimport相关日志,里面会记录导入过程中的详细错误(比如字段类型不匹配、数据转换失败),这些错误可能导致导入中途终止,仅导入部分数据。


内容的提问来源于stack exchange,提问作者arcee123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:51:19