`
wangwanbao
  • 浏览: 20590 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Comass的增量索引----数据同步

阅读更多

    Compass的数据同步(Data Mirror),实话说,我一直都没有调试成功过。有兴趣的朋友可以参考SpringSide的文档。http://wiki.springside.org.cn/display/springside/Compass。当时曾构思过,不如自已写一个SPRING的AOP来同步?后来做好后居然发现Compass居然也提供了AOP的关于同步的组件。郁闷。下文中,我主要介绍如何使用Compass的AOP和DAO层协作实现我的Data Mirror功能。本文仍延用上一篇文章中的环境,案例。请查阅博客地址:

http://wangwanbao.iteye.com/admin/blogs/368252

 

一、实现Hibernate的DAO

代码不多,直接给出好了。

public class GenericDaoImpl extends HibernateDaoSupport implements GenericDao {
	
	Session session;
	
	public Session getHibernateSession(){
		if(null == session)
			session = getSession();
		return session;
	}
	@SuppressWarnings("unchecked")
	public List findByHQL(final String hql) {
		return (List) getHibernateTemplate().executeWithNativeSession(
				new HibernateCallback() {
					public Object doInHibernate(Session session)
							throws HibernateException, SQLException {
						Query query = session.createQuery(hql);
						return query.list();
					}

				});
	}

	public <T> List<T> getAll(Class<T> entityClass) {
		return this.getHibernateTemplate().loadAll(entityClass);
	}

	public void deletebyID(Class entityClass, Serializable id) {
		this.delete(this.getbyID(entityClass, id));

	}

	public void deleteByList(Collection con) {
		this.getHibernateTemplate().deleteAll(con);
	}

	public void save(Object o) {
		getHibernateTemplate().saveOrUpdate(o);
	}

	public void delete(Object o) {
		this.getHibernateTemplate().delete(o);
	}

	public <T>T getbyID(Class<T> entityClass, Serializable id) {
		Object o = this.getHibernateTemplate().get(entityClass, id);
		if (o == null) {
			throw new ObjectRetrievalFailureException(entityClass, id);
		}
		return (T) o;
	}

	public <T> List<T> findBy(Class<T> entityClass, String name, Object value) {
		Assert.hasText(name);
		Criteria criteria = getEntityCriteria(entityClass);
		criteria.add(Restrictions.eq(name, value));
		return criteria.list();
	}
	
	public <T> List<T> findByParameters(Class<T> entityClass, String[] name, Object[] value) {
		Criteria criteria = getEntityCriteria(entityClass);
		for(int i=0;i<name.length;i++){
			criteria.add(Restrictions.eq(name[i], value[i]));
		}
		return criteria.list();
	}

	protected Criteria getEntityCriteria(Class entityClass) {
		return getHibernateSession().createCriteria(entityClass);
	}
}

 

  二、Spring的配置文件:

 

<bean id="compassSaveAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice">
			<bean class="org.compass.spring.aop.CompassSaveAdvice">
				<property name="compass" ref="compass" />
			</bean>
		</property>
		<property name="pattern" value=".*save" />
	</bean>

	<bean id="compassDeleteAdvisor"
		class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice">
			<bean class="org.compass.spring.aop.CompassDeleteAdvice">
				<property name="compass" ref="compass" />
			</bean>
		</property>
		<property name="pattern" value=".*delete" />
	</bean>

	<bean id="proxyCreator"
		class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
		<property name="beanNames">
			<list>
				<value>genericDao</value>
			</list>
		</property>
		<property name="interceptorNames">
			<list>
				<value>compassSaveAdvisor</value>
				<value>compassDeleteAdvisor</value>
			</list>
		</property>
	</bean>

 

其中上面的genericDao指我们的DAO文件的bean。它必须是实现接口的实现,否则的时候在获取genericDao的Bean时,会出现ClassCastException,这是J2se反射的机制。

 

三、测试代码

		GenericDao gd = (GenericDao) factory.getBean("genericDao");
		Course course = gd.getbyID(Course.class, 1);
		HomeTown ht = gd.getbyID(HomeTown.class, 1);
		List<Course> courses = new ArrayList<Course>();
		courses.add(course);
		
		Student s = new Student();
		s.setName("Jerry");
		s.setCourses(courses);
		s.setHomeTown(ht);
		gd.save(s);
		
		CompassDaoImpl cd = (CompassDaoImpl) factory.getBean("compassDAO");
		List<SearchRequest.SearchField> searchFields = new ArrayList<SearchRequest.SearchField>();
		SearchRequest.SearchField s1 = new SearchRequest().new SearchField();
		s1.setFieldName("Student.name");
		s1.setFieldType(Occur.MUST);
		s1.setFieldValue("Jerry");
		searchFields.add(s1);
		
		SearchRequest sr = new SearchRequest();
		sr.setAlias("Student");
		sr.setEntityClass(Student.class);
		sr.setFields(searchFields);
		List<Student> students = cd.searchByOSEM(sr);
		if(students.size() <1){
			System.out.println("长度为0");
		}else{
			for(Student sd : students){
				System.out.println(sd.getName() + "---" + sd.getHomeTown().getCity());
			}
		}
	}

 

我们首先通过Dao增中一条学生记录,紧接着,立刻搜索学生,控制台输入内容正确。测试成功!

分享到:
评论
1 楼 terrychan 2009-04-17  
compass 的增量索引,和spring版本有严重暧昧关系
我有不成功到成功的经历,所以记忆深刻

相关推荐

    NIFI1.21.0-大数据同步处理模板-MysqlToMysql增量同步-单表-处理日期-空值数据.zip

    NIFI1.21.0_大数据同步处理模板_MysqlToMysql增量同步_单表_处理日期_空值数据.zip 是作者自己实际项目中用到的,自己学习后制作的NIFI流程模板文件,导入后可以直接使用, 实现了Mysql到mysql数据库的增量CDC数据的...

    基于lucene技术的增量索引

    本文将深入探讨如何利用Lucene实现增量索引,这是一种在数据库或文件系统更新时仅对新数据或变化数据进行索引的技术,以降低资源消耗并保持搜索性能。 **1. Lucene基础知识** Lucene首先需要理解的是它的核心概念,...

    kettle数据增量同步实现

    kettle的使用手册,及个人实现的数据增量同步,亲测可行!

    使用Kettle同步mysql数据,增量同步教程执行步骤

    请参考提供的“使用Kettle同步数据.pdf”文档,其中应包含更详细的步骤说明和示例,以帮助你更好地理解和实施这个过程。另外,"摄图网_500783894.jpg"可能是相关的示例图片,可以辅助理解教程内容。在实践中,务必...

    Lucene5学习之增量索引(Zoie)

    然而,随着数据量的不断增长,如何高效地进行增量索引,即只对新增或更新的数据进行索引,而无需重新构建整个索引,成为了实际应用中的关键问题。这就是Zoie系统发挥作用的地方。 Lucene本身并不直接支持增量索引,...

    MSSQL_SERVER数据库增量同步软件(数据库结构及数据)

    MSSQL_SERVER数据库增量同步软件(数据库结构及数据): 可以增量同步的....7.同步表结构,此功能是只同步结构,不同步数据.(会同步表的结构,包含所有索引,默认值,主键.和属性.同步存储过程.函数.视图.触发器)

    java使用datax增量同步代码

    Java 使用 DataX 进行增量同步是大数据领域中常见的数据迁移任务,DataX 是阿里开源的一个强大、高效的数据同步工具,它可以实现不同数据存储之间的数据迁移。本篇将详细讲解如何在 Java 项目中利用 DataX 实现增量...

    人工智能-项目实践-增量学习-基于半监督密度聚类+增量学习的故障诊断).zip

    增量学习是解决这个问题的有效方法,但它严重依赖标记数据并且无法检测数据中的新类别,这使得它在实际应用中并不理想。 鉴于此,设计了一种基于半监督式增量学习的工业物联网设备故障诊断系统,该系统包括:故障...

    跟益达学Solr5之增量索引MySQL数据库表数据

    总的来说,通过学习这个主题,我们可以掌握如何利用Solr 5和MySQL之间的集成,实现高效的数据索引,这对于大数据环境下的实时搜索应用至关重要。理解并熟练掌握这些知识,将有助于提升我们的IT技能,特别是在大数据...

    kettle增量方案数据同步

    kettle增量方案全量比对取增量-根据唯一标示

    kettle实现时间戳增量同步案例

    时间戳增量同步是指只同步自上次同步以来发生改变的数据,通常依据数据记录中的时间戳字段来判断是否为新数据。这种方法能够有效减少不必要的数据传输,提高数据处理效率。 2. **Kettle环境准备** 首先,你需要...

    掌讯3518-V005原版root增量包-190117(内有说明).7z

    此增量包只能用在-掌讯3518-V005-190117官方版本固件,卡刷此增量包后 可增加root权限。桌面会自动增加magisk应用。 注意只能用在3518-V005上并且必须是190117版本基础上刷。 刷入方法:将root-ZL-3518-V005-...

    Datax实现增量同步数据到Postgres

    标题 "Datax实现增量同步数据到Postgres" 涉及到的是使用开源数据同步工具 Datax 进行数据迁移的场景,特别是针对从某个源数据库到PostgreSQL数据库的增量同步。Datax 是阿里巴巴开发的一款高效、稳定且强大的数据...

    Kettle增量同步.rar

    Kettle增量同步,里边包含项目文件...初次更新 需要初始化 edp_etl_record表 里面 data_range_fm、data_range_to 字段为 需要抽取数据表中的 min(唯一自动或时间戳),此时表示同步全量,执行完毕后第二次开始同步增量

    solr6.5.1定时增量apache-solr-dataimportscheduler

    DataImportHandler(DIH)是一个强大的工具,允许Solr与各种数据源进行交互,将这些数据转换为Solr可以理解的格式,然后索引到Solr中。它支持全量导入和增量导入,全量导入是重新导入所有数据,而增量导入则只导入自...

    Solr数据库插入(全量和增量)索引

    我们的测试结果表明,全量索引和增量索引都可以正确地将数据插入 Solr 索引库中,并且可以实时地更新索引。 结论 通过以上测试结果,我们可以看到,Solr 数据库插入全量和增量索引可以正确地将数据插入 Solr 索引...

    Pgsql跨网络数据库增量同步

    1、 跨网络进行增量同步数据,即隔着网闸,网络不能直连,使用dblink、主从库等方案解决不了; 2、 源表跟目标表字段名称可以不一致,但表名称要一致(表名称不一致也可以实现); 3、 自定义增量的控制字段,可以是...

    大数据处理NIFI模板-MySqlToMySql增量数据实时同步-利用Binlog实时同步数据.zip

    终于攻克了,使用mysql的binlog功能,来实现,insert,update,delete数据的实时同步,增量同步,有了这个流程工具以后,同步数据就变得非常方便了. MySql的Binlog打开以后,然后直接把下载的模板导入到自己的nifi中去,然后...

    数据仓库-数据同步-canal1

    数据同步是指在不同的数据源之间同步数据的过程。Canal是阿里巴巴集团开源的一款数据同步工具,能够实时同步 MySQL 数据库的增量数据到目标数据库中。 Canal 由 Canal Server 和 Canal Client 两部分组成,Canal ...

Global site tag (gtag.js) - Google Analytics