Solr服务器配置自动索引

接着上一篇说,Solr服务器搭建完了,也可以手工进行数据导入和索引了。但是需要人工参与太麻烦了。我们肯定有办法让他定时进行索引对吧。

使用工具:

  solr-dataimportscheduler-1.1.jar

(参考地址:https://code.google.com/p/solr-dataimport-scheduler/downloads/list

第一步:

  拷贝文件solr-dataimportscheduler-1.1.jar到lib目录。我的就是D:\Working\solr\tomcat\webapps\solr\WEB-INF\lib

第二步:

  在core根目录,也就是D:\Working\solr\tomcat-solr目录新建一个conf目录

  把apache-solr-dataimportscheduler-1.0目录里的dataimport.properties拷贝到conf目录里。

  (注:dataimport.properties来源于1.0, 1.1版本是网上的修改版本)

第三步:

修改D:\Working\solr\tomcat\webapps\solr\WEB-INF目录下的web.xml文件。新建一个监听。

<listener>  
         <listener-class>org.apache.solr.handler.dataimport.scheduler.ApplicationListener</listener-class>  
   </listener> 

第四步:

根据自己需求修改dataimport.properties文件。发个我的范例。

#################################################
#                                               #
#       dataimport scheduler properties         #
#                                               #
#################################################

#  to sync or not to sync
#  1 - active; anything else - inactive
syncEnabled=1

#  which cores to schedule
#  in a multi-core environment you can decide which cores you want syncronized
#  leave empty or comment it out if using single-core deployment
#syncCores=game,resource
syncCores=TBNewsClass,TBNews,TBDept,TBAgent,TBDistrict,TBCommunity,TBHouse

#  solr server name or IP address
#  [defaults to localhost if empty]
server=localhost

#  solr server port
#  [defaults to 80 if empty]
port=8080

#  application name/context
#  [defaults to current ServletContextListener's context (app) name]
webapp=solr

#  URL params [mandatory]
#  remainder of URL
#params=/select?qt=/dataimport&command=delta-import&clean=false&commit=true
params=/dataimport?command=full-import&clean=true&commit=true

#  schedule interval
#  number of minutes between two runs
#  [defaults to 30 if empty]
interval=1440

#  重做索引的时间间隔,单位分钟,默认7200,即1天(这个是网上说的,为啥我算的结果是1440是一天呢); 
#  为空,为0,或者注释掉:表示永不重做索引
reBuildIndexInterval=1440

#  重做索引的参数
reBuildIndexParams=/dataimport?command=full-import&clean=true&commit=true

#  重做索引时间间隔的计时开始时间,第一次真正执行的时间=reBuildIndexBeginTime+reBuildIndexInterval*60*1000;
#  两种格式:2012-04-11 03:10:00 或者  03:10:00,后一种会自动补全日期部分为服务启动时的日期
reBuildIndexBeginTime=2014-11-18 1:00:00

第五步:

重启tomcat即可。

注意:JTDS驱动连接SQLServer异常解决

通过我的使用,当导入大数据的时候有可能会造成数据库死锁。然后系统就没法使用了。引用网上的一篇文章,还未测试,不确定是否这个原因。

1.出现的问题
日志文件没有新的输出。

2.问题分析
dump出堆栈,如下:
"main" prio=10 tid=0x000000005de12000 nid=0x27e8 runnable [0x0000000040240000]
java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at java.io.DataInputStream.readFully(DataInputStream.java:152)
at net.sourceforge.jtds.jdbc.SharedSocket.readPacket(SharedSocket.java:842)
at net.sourceforge.jtds.jdbc.SharedSocket.getNetPacket(SharedSocket.java:723)
- locked <0x0000000759fd9f90> (a java.util.ArrayList)
at net.sourceforge.jtds.jdbc.ResponseStream.getPacket(ResponseStream.java:466)
at net.sourceforge.jtds.jdbc.ResponseStream.read(ResponseStream.java:135)
at net.sourceforge.jtds.jdbc.ResponseStream.readString(ResponseStream.java:290)
at net.sourceforge.jtds.jdbc.ResponseStream.readNonUnicodeString(ResponseStream.java:274)
at net.sourceforge.jtds.jdbc.TdsData.readData(TdsData.java:936)
at net.sourceforge.jtds.jdbc.TdsCore.tdsRowToken(TdsCore.java:3007)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2270)
at net.sourceforge.jtds.jdbc.TdsCore.getNextRow(TdsCore.java:765)
at net.sourceforge.jtds.jdbc.JtdsResultSet.next(JtdsResultSet.java:596)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:207)
at com.jd.cis.worker.OppProductWorker.importData(OppProductWorker.java:310)
at com.jd.cis.worker.BaseWorker.importDataSource(BaseWorker.java:416)
at com.jd.cis.worker.OppProductWorker.doRun(OppProductWorker.java:276)
at com.jd.cis.worker.BaseWorker.run(BaseWorker.java:448)
at com.jd.cis.worker.OppProductWorker.main(OppProductWorker.java:564)

上面有锁,对应的代码为
statement.setFetchSize(1000);
.....
resultSet = statement.executeQuery();
while (resultSet.next()) {
......
}
查询相关文档,了解到JTDS默认的socketTimeout为0,即读取数据没有超时时间。
当数据链接意外终止的时候,JDTS可能检测不到,就会一直等待数据,阻塞进程。

在本地重现该问题,在循环体里面设置断点,进入断点后,断掉所有网络链接,取消断点,继续运行,发现程序被一致阻塞了。
当设置socketTimeout为60秒,重试,程序阻塞60秒后抛出异常。

该问题在查询SQLServer数据库,大数据量查询,分批获取的时候,容易出现

3.解决方案
为jdts的url链接中加上socketTimeout(单位秒)的设置,或在dbcp中如下设置
<property name="connectionProperties" value="characterEncoding=UTF-8;socketTimeout=60"/>
这个参数和mybatis的defaultStatementTimeout 参数是不一样的

同时Worker中加入异常捕获重试机制

原文地址:https://www.cnblogs.com/randytech/p/4139191.html