设为首页 收藏本站
查看: 913|回复: 0

[经验分享] solr dataimport 数据导入源码分析(十)总结

[复制链接]

尚未签到

发表于 2015-7-17 10:17:40 | 显示全部楼层 |阅读模式
  我写这系列solr数据导入源码分析主要是解决我们在编程方式导入数据库数据的时候,怎么解决大数据集导入索引的内存溢出问题的
  如果数据表的数据不大,用常规方法不会产生内存溢出的问题,当数据表数据上千万级的时候,可参考solr自带的数据导入方式
  我刚开始用编程方式添加solr索引的时候,很容易产生内存溢出问题,所以我就想考究solr自带的数据导入是怎么处理大数据集索引添加的;
  网上一些参考的方法通常是采取类似数据分页的方式,个人感觉比较拙劣,并且在针对不同数据库的时候,采取类似数据分页方式还要考虑不同数据库分页方式的差异(数据库方言),而且容易出现性能等问题。
  我的处理方式如下
  DatabaseResourc.java

public class DatabaseResource {
    private static final Logger logger = LoggerFactory.getLogger(DatabaseResource.class);
   
    private DataSource dataSource;
   
    /**
     * Set the JDBC DataSource to obtain connections from.
     */
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * Return the DataSource used by this template.
     */
    public DataSource getDataSource() {
        return this.dataSource;
    }
   
    public DatabaseResource()
    {
        
    }
   
    public DatabaseResource(DataSource datasource)
    {
        setDataSource(dataSource);
    }

    /**
     * 执行sql语句
     */
    public void executesql(String sql,JDBCCallback callback)
    {
               
        Connection conn = JDBCContext.getJdbcContext(getDataSource()).getConnection();
        
        Statement stmt = null;
        ResultSet rst = null;
   
        try
        {            
            
            stmt = conn.createStatement();
            stmt.setFetchSize(50);            
            callback.processRow(rst=stmt.executeQuery(sql));
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            closeStatement(stmt);
            closeResultSet(rst);            
            JDBCContext.getJdbcContext(getDataSource()).releaseConnection();
            
        }
    }

    public void closeConnection(Connection con) {
        if (con != null) {
            try {
                con.close();
            }
            catch (SQLException ex) {
                logger.debug("Could not close JDBC Connection", ex);
            }
            catch (Throwable ex) {
                // We don't trust the JDBC driver: It might throw RuntimeException or Error.
                logger.debug("Unexpected exception on closing JDBC Connection", ex);
            }
        }
    }
    public void closeStatement(Statement stmt) {
        if (stmt != null) {
            try {
                stmt.close();
            }
            catch (SQLException ex) {
                logger.trace("Could not close JDBC Statement", ex);
            }
            catch (Throwable ex) {
                // We don't trust the JDBC driver: It might throw RuntimeException or Error.
                logger.trace("Unexpected exception on closing JDBC Statement", ex);
            }
        }
    }
    public  void closeResultSet(ResultSet rs) {
        if (rs != null) {
            try {
                rs.close();
            }
            catch (SQLException ex) {
                logger.trace("Could not close JDBC ResultSet", ex);
            }
            catch (Throwable ex) {
                // We don't trust the JDBC driver: It might throw RuntimeException or Error.
                logger.trace("Unexpected exception on closing JDBC ResultSet", ex);
            }
        }
    }  }
  其中JDBCCallback是一个数据读取接口

import java.sql.ResultSet;

public interface JDBCCallback {
    void processRow(ResultSet rst);
  }
  然后我们可以这样获取数据,并添加到solr索引里面

        private static int fetchSize = 1000;

        BasicDataSource datasource = new BasicDataSource();
        //设置datasource参数
        DatabaseResource  resource=new DatabaseResource(datasource);
        String sql="";
        resource.executesql(sql, new JDBCCallback()        
        {
            public void processRow(final ResultSet rst)            
            {
                try {
                    Collection docs = new ArrayList();
                    SolrInputDocument document=null;
                    int innerCount=0;
                    while(rst.next())
                    {
                        innerCount++;                                    
                        document=new SolrInputDocument();
                        //这里补充不同字段类型的处理 参考下文switch case语句
                        document.addField("fieldname",rst.getString("字段名称"));
                        //添加其他字段

                        docs.add(document);
            
                        if (innerCount == fetchSize)
                        {
                            DigContext.getSolrserver().add(docs);   
                            docs.clear();
                            innerCount = 0;
                        }                                    
                    }
                    if (innerCount != 0)
                    {
                       DigContext.getSolrserver().add(docs);
                    }                    
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (SolrServerException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParseException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }  });
这是一个精简版,如果还要实现类似transformer数据转换及格式化等功能,可以进一步的封装

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87565-1-1.html 上篇帖子: solr加ik分词器 下篇帖子: Windows下面安装和配置Solr 4.9(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表