昨天碰到了一个问题,真的是把快我搞死了,导致我代码写下去的勇气都没有了,最后大爷我干脆不写了,我躺着睡觉还不行吗
问题是这样的,就是导入商品数据到索引库时报错了。实现这一功能时,我的service层的代码是这样开发写的,这里我只是将最关键的类的代码给贴出来了。
以上实现类中所用到的HttpSolrClient对象是由Spring容器来管理的,如下图所示。
以上配置可是一点问题都没有啊!你不要给我说什么上面的配置有问题啊之类的,闭嘴!
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条自己写的商品数据到索引库中,看得不得行呗!于是,咱说干就干。
在执行这个测试方法的同时,老子变聪明了,在Linux服务器中的Tomcat(服务器)启动的过程中,使用tail -f logs/catalina.out
命令时时监控Tomcat服务器后台启动情况,看有没有报什么错。结果是没有报什么错,而且这3000条自己写的商品数据真的导入到索引库中去了。
这个时候,我就想了,为什么3000条自己写的商品数据能够导入到索引库中去,而从数据库中查询出来的3097条商品数据却不能导入到索引库中去呢?这个问题真的快把我想疯了,老子也不管了,再在后台管理系统首页再次点击一键导入商品数据到索引库
按钮,同时也使用tail -f logs/catalina.out
命令时时监控Tomcat服务器后台启动情况,结果突然就报出了这样一个异常。
这TM是堆内存溢出错误啊!给老子整笑了,3097条商品数据都不能导入到索引库中去,尼玛的,这是要闹哪样啊!老子还偏不信邪,于是我重启Linux服务器,然后启动Tomcat服务器,接着到Solr应用的首页去看了一下,发现还是TMD导入了162条商品数据啊!
你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内存配置已经生效了!
接着我再到后台管理系统首页中点击一键导入商品数据到索引库
按钮,发现终于能将从数据库中查询出来的3097条商品数据导入到索引库中了。
解决这个错误,我实在是太高兴了,我都快蹦起来了,这个问题可是困扰了我快一天半了!