摘要:
上部分的代码还可以进一步优化,主要是构建Collection<SolrInputDocument>集合,分批次提交,优化新增索引速度其实分页方式也是分批次提交的,不过这种方式 更优雅参考如下代码importjava.io.IOException;importjava.net.MalformedURLException;importjava.sql.ResultSet;importjava.sql.ResultSetMetaData;importjava.sql.SQLException;importjava.sql.Types;importjava.util.ArrayList;i 阅读全文
2012年9月10日 #
摘要:
我写这系列solr数据导入源码分析主要是解决我们在编程方式导入数据库数据的时候,怎么解决大数据集导入索引的内存溢出问题的如果数据表的数据不大,用常规方法不会产生内存溢出的问题,当数据表数据上千万级的时候,可参考solr自带的数据导入方式我刚开始用编程方式添加solr索引的时候,很容易产生内存溢出问题,所以我就想考究solr自带的数据导入是怎么处理大数据集索引添加的;网上一些参考的方法通常是采取类似数据分页的方式,个人感觉比较拙劣,并且在针对不同数据库的时候,采取类似数据分页方式还要考虑不同数据库分页方式的差异(数据库方言),而且容易出现性能等问题。我的处理方式如下DatabaseResourc 阅读全文
摘要:
上文solr dataimport源码主要实现的是数据读取功能下面我们接着看数据连接的实现的源码:privateConnectiongetConnection()throwsException{longcurrTime=System.currentTimeMillis();if(currTime-connLastUsed>CONN_TIME_OUT){synchronized(this){ConnectiontmpConn=factory.call();closeConnection();connLastUsed=System.currentTimeMillis();returnconn 阅读全文
摘要:
数据读取类 JdbcDataSource.javaResultSetIterator是JdbcDataSource的内部类,用于从数据库读取数据privateclassResultSetIterator{ResultSetresultSet;Statementstmt=null;List<String>colNames;Iterator<Map<String,Object>>rSetIterator;publicResultSetIterator(Stringquery){try{Connectionc=getConnection();stmt=c.crea 阅读全文
摘要:
在solr dataimport 数据导入源码分析(五)提到了contextimpl类调用DataImporter对象获取数据源contextimpl.javaprivateDataSourceds;privateDataImporterdataImporter;@OverridepublicDataSourcegetDataSource(){if(ds!=null)returnds;if(entity==null)returnnull;if(entity.dataSrc==null){entity.dataSrc=dataImporter.getDataSourceInstance(enti 阅读全文
2012年9月9日 #
摘要:
DocBuilder类的简要代码如下,通过传入context参数到EntityProcessorWrapper类的构造函数,然后执行EntityProcessorWrapper的init()方法初始化数据源;然后调用EntityProcessorWrapper的相关方法获取数据(全部导入或增量导入数据)publicclassDocBuilder{privatevoiddoFullDump(){buildDocument(getVariableResolver(),null,null,root,true,null);}privatevoiddoDelta(){Set<Map<Stri 阅读全文
摘要:
我们注意到EntityProcessorWrapper的初始化方法@Overridepublicvoidinit(Contextcontext){delegate.init(context); }这里context是上下文对象,通过context获取数据源,context是抽象类publicabstractclassContext{publicabstractDataSourcegetDataSource();publicabstractDataSourcegetDataSource(Stringname);publicabstractEntityProcessorgetEntityProce 阅读全文
摘要:
我们查看DocBuilder类的源码发现,并不是直接持有对SqlEntityProcessor类的引用,而是另外一个包装类EntityProcessorWrapper,EntityProcessorWrapper直接继承自抽象类EntityProcessor,而不是继承自中间的EntityProcessorBase类,简要类图如下包装类额外添加了缓存处理以及格式转换等功能,然后调用SqlEntityProcessor相应方法进行处理,相当于SqlEntityProcessor的代理类,共同继承自抽象类EntityProcessor(SqlEntityProcessor 是通过EntityPro 阅读全文
摘要:
在介绍DocBuilder类之前,我们先来解读数据导入对应实体处理器EntityProcessor,默认的实体处理器为SqlEntityProcessorEntityProcessor为抽象类,具体方法由子类实现packageorg.apache.solr.handler.dataimport;importjava.util.Map;publicabstractclassEntityProcessor{publicabstractvoidinit(Contextcontext);publicabstractMap<String,Object>nextRow();publicabst 阅读全文
摘要:
上文说由DataImporter类进一步处理,DataImporter类的简要代码如下/************************************************************************Module:DataImporter.java*Author:Administrator*Purpose:DefinestheClassDataImporter***********************************************************************/importjava.util.*;/**@pdOid6bcd 阅读全文