• 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中加入异常捕获重试机制

  • 相关阅读:
    PJzhang:CVE-2020-1472微软NetLogon权限提升漏洞~复现
    PJzhang:vulnhub靶机sunset系列SUNSET:DECOY
    PJzhang:vulnhub靶机sunset系列SUNSET:TWILIGHT
    PJzhang:vulnhub靶机sunset系列SUNSET:SUNRISE
    PJzhang:vulnhub靶机sunset系列SUNSET:MIDNIGHT
    PJzhang:vulnhub靶机sunset系列SUNSET:SOLSTICE
    PJzhang:whatweb指纹扫描工具样例
    HTTP状态码解读
    【并发】线程与进程的区别
    MYSQL之性能优化 ----MySQL性能优化必备25条
  • 原文地址:https://www.cnblogs.com/randytech/p/4139191.html
Copyright © 2020-2023  润新知