springboot练习12 solr与数据库之间的数据同步

  • 修改原获取json数据直接插入solr索引库的方法
  • 增加数据库与solr库之间的同步方法

首先在数据量不是很多的前提下,我们先进行单表查询,将数据查询出来,然后通过设置一个临界值,对集合进行拆分,例如:分成大小为100的集合,再调用NewDocSolr提供的批量插入的方法,将数据库查出的数据通过线程同步的方式同步到solr库。

实现以下这个简单的递归方法(前些天测试用的重复的数据已经sql语句已经去掉了):

1 定义接口方法和实现查询接口的方法在newDao中新增一个查询所有的方法,但返回值不是news对象 返回值为newsDoc solr文档对象

public interface NewsDao extends BaseDao<News> {

	List<NewDoc> getNewDocList();

}

 实现这个方法

package com.gc.dao.impl;



import java.util.List;

import org.springframework.stereotype.Component;

import com.gc.dao.NewsDao;
import com.gc.doc.NewDoc;
import com.gc.entity.News;

@Component
public class NewsDaoImpl extends BaseDaoImpl<News> implements NewsDao {
 
	
	@Override
	public List<NewDoc> getNewDocList() { // 从继承的baseDaoImpl中获取sqlSession对象
		
		return this.sqlSession.selectList(News.MAPPER+".getNewDocList");
	}

	
}

2 提供一个查询所有数据的执行器,在这直接在newsMapper.xml中提供一个查询所有的方法(不建议使用select * from xxxx),在此执行器中,通过返回值resultType,封装成newDoc对象

<select id="getNewDocList" resultType="com.gc.doc.NewDoc">
	SELECT
		FID AS "id",
		FVOTECOUNT AS "votecount",
		FDOCID As "docid" ,
		FLMODIFY As "lmodify",
		FURL_3W As "url_3w",
		FSOURCE As "source",
		FPOSTID As "postid",
		FPRIORITY As "priority",
		FTITLE As "title",
		FMTIME As "mtime",
		FURL As "url",
		FREPLYCOUNT As "replyCount",
		FPTIME AS "ptime",
		FLTITLE AS "ltitle",
		FSUBTITLE AS "subtitle",
		FDIGEST AS "digest",
		FBOARDID AS "boardid",
		FIMGSRC	 AS "imgsrc"
	FROM T_NEWS_NEWS
	
	</select>

3 在newService接口新增一个数据同步的方法定义

/**
	 * 将数据从数据库查询出来
	 * 插入到solr索引库
	 */
	void importDataFromDataBaseToSolr();

4 接下来完成我们需要逻辑实现定义的方法

  • 查询出所有的新闻数据
  • 集合拆分
  • 递归调用
  • 线程同步

为了方便以后数据量大的时候便于修改拆分的临界值,将它配置在application.properties文件中

solr.import.maxIndex=100

在实现类中通过Value注解加上表达式完成赋值

@Value("${solr.import.maxIndex}") //从配置文件中获取一次同步的最大数量
private Integer maxIndex;

@Override
	public void importDataFromDataBaseToSolr() {
		List<NewDoc> select = newsDao.getNewDocList();//查询出所有的数据 提供查询方法 在Mapper里通过resultType指定返回值类型为solr的文本对象
		importToSolr(select);
	}

private void importToSolr(List<NewDoc> select) {
		if(select!=null && select.size()>0){
			if(select.size()<=maxIndex){ // 集合中的数据小于或者等于 最大量时直接导入
				newsSolr.addList(select);
			}else{  // 结合中的数据量大于 设置的值 截取第一部分  对剩下的部门进行二次截取  获得集合中剩下的部分
				List<NewDoc> subList = select.subList(0, maxIndex);
				new Thread(){
					@Override
					public void run(){
						System.err.println(Thread.currentThread().getName());
						newsSolr.addList(subList);
					}
				}.start();
				List<NewDoc> secondList = select.subList(maxIndex, select.size());
				importToSolr(secondList);
				
				
			}
		}
		
	}

5 提供方法入口并在页面提供触发按钮

/**
	 * 1 调用查询全部的方法
	 * @return
	 */
	@RequestMapping("importDataFromDataBaseToSolr")
	@ResponseBody
	public ResultData importDataFromDataBaseToSolr(){
		try{
			newsService.importDataFromDataBaseToSolr();
		}catch(Exception e){
			new ResultData("-1","导入失败!",e.getMessage());
			e.printStackTrace();
			
		}
		return new ResultData("200","导入成功!","导入成功!");
	}

绑定点击事件之前需要定义个按钮并给出id 

$("#claerAndImportData").click(function(){
	var url ="/newsDataBase/importDataFromDataBaseToSolr";// 同步solr数据
	$.post(url,{},function(res){
		if(res.code==200){
			$.ligerDialog.tip({icon: 'succeed', time: 1, content:res.msg});
			$list_dataGrid.loadData();
		}else{
			$.ligerDialog.tip(res.msg);
		}
		
	});
	
	
});

数据库与solr库的数据同步就完成了,在数据量大的情况下,可以将查询sql进行分页,然后分页导入solr引库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Master_slaves

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值