淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException

问题描述

昨天碰到了一个问题,真的是把快我搞死了,导致我代码写下去的勇气都没有了,最后大爷我干脆不写了,我躺着睡觉还不行吗

问题是这样的,就是导入商品数据到索引库时报错了。实现这一功能时,我的service层的代码是这样开发写的,这里我只是将最关键的类的代码给贴出来了。
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第1张图片
以上实现类中所用到的HttpSolrClient对象是由Spring容器来管理的,如下图所示。
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第2张图片
以上配置可是一点问题都没有啊!你不要给我说什么上面的配置有问题啊之类的,闭嘴!

service层的代码写的有错吗?压根就没有,要是谁觉得我写的代码有问题,请提刀来砍我的狗头!下面我就给大家整个活呗!我在后台管理系统首页点击一键导入商品数据到索引库按钮,满心以为是能够成功的,即使是要花费一点时间,花就花呗!老子有的是时间。结果是万万没想到啊!老子等了那么久,结果你就给我看这么一个异常。

org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException: Error from server at http://192.168.81.133:8080/solr/core1: Server error writing document id 536563 to the index
	at org.apache.solr.client.solrj.impl.HttpSolrClient.executeMethod(HttpSolrClient.java:665)
	at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:265)
	at org.apache.solr.client.solrj.impl.HttpSolrClient.request(HttpSolrClient.java:248)
	at org.apache.solr.client.solrj.SolrRequest.process(SolrRequest.java:211)
	at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:177)
	at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:138)
	at org.apache.solr.client.solrj.SolrClient.add(SolrClient.java:156)
	at com.taotao.search.service.impl.SearchServiceImpl.importAllSearchItems(SearchServiceImpl.java:42)
	at com.alibaba.dubbo.common.bytecode.Wrapper1.invokeMethod(Wrapper1.java)
	at com.alibaba.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:46)
	at com.alibaba.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:72)
	at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53)
	at com.alibaba.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:64)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:75)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:42)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:78)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:60)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:112)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:38)
	at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91)
	at com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:108)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:84)
	at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:170)
	at com.alibaba.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:52)
	at com.alibaba.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:82)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at java.lang.Thread.run(Thread.java:748)

老子DNMD!于是我就在网上找了好多人写的博客,想找出这个异常出现的原因以及如何解决这个异常,结果自然是徒劳无功了。突然我灵光一现,不就是从数据库中查询出3097条商品数据然后再将其导入到索引库中吗?老子写个循环硬生生导3000条自己写的商品数据到索引库中,看得不得行呗!于是,咱说干就干。
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第3张图片
在执行这个测试方法的同时,老子变聪明了,在Linux服务器中的Tomcat(服务器)启动的过程中,使用tail -f logs/catalina.out命令时时监控Tomcat服务器后台启动情况,看有没有报什么错。结果是没有报什么错,而且这3000条自己写的商品数据真的导入到索引库中去了。

这个时候,我就想了,为什么3000条自己写的商品数据能够导入到索引库中去,而从数据库中查询出来的3097条商品数据却不能导入到索引库中去呢?这个问题真的快把我想疯了,老子也不管了,再在后台管理系统首页再次点击一键导入商品数据到索引库按钮,同时也使用tail -f logs/catalina.out命令时时监控Tomcat服务器后台启动情况,结果突然就报出了这样一个异常。
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第4张图片
这TM是堆内存溢出错误啊!给老子整笑了,3097条商品数据都不能导入到索引库中去,尼玛的,这是要闹哪样啊!老子还偏不信邪,于是我重启Linux服务器,然后启动Tomcat服务器,接着到Solr应用的首页去看了一下,发现还是TMD导入了162条商品数据啊!
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第5张图片
你TMD要导就给我将全部商品数据导入进去,只导162条商品数据是什么意思,看不起我啊!艹

报错原因

昨天就报了这个异常了,导致昨天啥事也没干。今天醒来,发现解决不了这个异常,我就要去死了。于是,又在网上搜啊!结果突然找到一篇文章,看了这篇文章,感觉原因应该是找到了。

由于我在Linux服务器上搭建了一个单机版Solr 8.4.0服务,在添加了162条商品数据之后怎么添加都加不进去,通过简单的分析和观察,发现是JVM内存占满了。如果Solr服务启动的时候未指定内存,那么就会使用默认内存,也即512M。这样,在使用的过程中你会发现Solr会变得很慢,可能原因是默认的内存使用完了。

解决方案

有一种解决方案是修改JVM内存存执。首先找到/usr/local/solr/tomcat/bin目录下面的catalina.sh脚本文件,然后在该文件的最前面加入下面这行配置:

JAVA_OPTS="-Xms1024m -Xmx1024m"

这意味着堆开始大小为1024MB,最大也为1024MB,尤其要注意-Xmx1024m,它会在Tomcat服务器启动时给Tomcat服务器以更多的堆空间。

千万记得要重启Linux服务器哟!然后立马重新启动Tomcat服务器,并到Solr应用的首页去看一下,你会发现JVM内存配置已经生效了!
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第6张图片
接着我再到后台管理系统首页中点击一键导入商品数据到索引库按钮,发现终于能将从数据库中查询出来的3097条商品数据导入到索引库中了。
淘淘商城第50讲——导入商品数据到索引库时,报错:org.apache.solr.client.solrj.impl.HttpSolrClient$RemoteSolrException_第7张图片
解决这个错误,我实在是太高兴了,我都快蹦起来了,这个问题可是困扰了我快一天半了!

你可能感兴趣的:(项目实战之淘淘商城)