Ignite缓存持久化例子

1、配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/test"></property>
        <property name="username" value="root"></property>
        <property name="password" value="root"></property>
    </bean>
    <bean class="org.apache.ignite.configuration.IgniteConfiguration" id="ignite.cfg">
        <property name="cacheConfiguration">
            <list>
                <bean class="org.apache.ignite.configuration.CacheConfiguration">
                    <property name="name" value="personCache"></property>
                    <property name="readThrough" value="true"></property>
                    <property name="writeThrough" value="true"></property>
                    <!-- Set cacheStoreFactory-->
                    <property name="cacheStoreFactory">
                        <bean class="javax.cache.configuration.FactoryBuilder" factory-method="factoryOf">
                            <constructor-arg value="com.peidw.ignite.store.PersonStore"></constructor-arg>
                        </bean>
                    </property>
                    <property name="queryEntities">
                        <list>
                            <bean class="org.apache.ignite.cache.QueryEntity">
                                <property name="keyType" value="java.lang.Long"></property>
                                <property name="valueType" value="com.peidw.ignite.model.Person"></property>
                                <property name="fields">
                                    <map>
                                        <entry key="id" value="java.lang.Long"></entry>
                                        <entry key="orgId" value="java.lang.Integer"></entry>
                                        <entry key="name" value="java.lang.String"></entry>
                                    </map>
                                </property>
                            </bean>
                        </list>
                    </property>
                </bean>

            </list>
        </property>

        <property name="peerClassLoadingEnabled" value="true"></property>
        <property name="discoverySpi">
            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
                <property name="joinTimeout" value="200"/>  <!-- 服务端不存就立刻退出-->

                <property name="ipFinder">

                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder">
                        <property name="addresses">
                            <list>

                                <value>127.0.0.1:47500</value>
                            </list>
                        </property>
                    </bean>
                </property>
            </bean>
        </property>

    </bean>

</beans>

实现的代码:

1、模型,Person.java,从上面的配置中我们可以看得出是使用了mysql数据库

DROP TABLE IF EXISTS `person`;

CREATE TABLE `person` (
  `id` bigint(20) NOT NULL,
  `orgId` bigint(20) DEFAULT NULL,
  `name` varchar(200) CHARACTER SET latin1 DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

package com.peidw.ignite.model;

/**
 * Created by ThinkPad on 2017-08-28.
 */
public class Person {
    private long id;
    private int orgId;
    private String name;
    public Person(){

    }
    public Person(long vid,int vorgId,String vname){
        this.id=vid;
        this.orgId=vorgId;
        this.name=vname;
    }
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public int getOrgId() {
        return orgId;
    }

    public void setOrgId(int orgId) {
        this.orgId = orgId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

PersonStore.java缓存实现类

package com.peidw.ignite.store;

import com.peidw.ignite.model.Person;
import org.apache.ignite.cache.store.CacheStore;
import org.apache.ignite.lang.IgniteBiInClosure;
import org.apache.ignite.resources.SpringResource;
import org.jetbrains.annotations.Nullable;

import javax.cache.Cache;
import javax.cache.integration.CacheLoaderException;
import javax.cache.integration.CacheWriterException;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Map;

/**
 * 缓存工厂
 * Created by peidw on 2017-08-28.
 */
public class PersonStore implements CacheStore<Long, Person> {
    @SpringResource(resourceName = "dataSource")
    private DataSource dataSource;

    @Override
    public void loadCache(IgniteBiInClosure<Long, Person> igniteBiInClosure, @Nullable Object... objects) throws CacheLoaderException {
        System.out.println(">> Loading cache from store...");

        try {
            Connection conn = dataSource.getConnection();
            PreparedStatement st = conn.prepareStatement("select * from PERSON");
            ResultSet rs = st.executeQuery();
             while (rs.next()) {
                 System.out.println("----------------->"+rs.getString(3));
                 Person person = new Person(rs.getLong(1),  rs.getInt(2), rs.getString(3));
                 igniteBiInClosure.apply(person.getId(), person);
             }

         } catch (Exception e) {
            throw new CacheLoaderException("Failed to load values from cache store.", e);

        }

    }

    @Override
    public void sessionEnd(boolean b) throws CacheWriterException {

    }

    @Override
    public Person load(Long aLong) throws CacheLoaderException {
        System.out.println(">> Loading person from store...");
        try (Connection conn = dataSource.getConnection()) {
            try (PreparedStatement st = conn.prepareStatement("select * from PERSON where id = ?")) {
                st.setString(1, aLong.toString());
                ResultSet rs = st.executeQuery();
                return rs.next() ? new Person(rs.getLong(1), rs.getInt(2), rs.getString(3) ) : null;
            }

        } catch (SQLException e) {
            throw new CacheLoaderException("Failed to load values from cache store.", e);

        }
    }

    @Override
    public Map<Long, Person> loadAll(Iterable<? extends Long> iterable) throws CacheLoaderException {
        return null;
    }

    @Override
    public void write(Cache.Entry<? extends Long, ? extends Person> entry) throws CacheWriterException {
        System.out.println(">> Loading person from store...");
        try (Connection conn = dataSource.getConnection()) {
            PreparedStatement st = conn.prepareStatement("insert into  PERSON(id,orgId,name)VALUE (?,?,?) ");
            st.setLong((int)1,(long)entry.getKey());
            st.setInt((int)2,entry.getValue().getOrgId());
            st.setString((int)3,entry.getValue().getName());
            st.executeUpdate();
            System.out.println(">> add person to store...");

        } catch (SQLException e) {
            throw new CacheLoaderException("Failed to add person  to table store.", e);
        }

    }

    @Override
    public void writeAll(Collection<Cache.Entry<? extends Long, ? extends Person>> collection) throws CacheWriterException {

    }

    @Override
    public void delete(Object o) throws CacheWriterException {

    }

    @Override
    public void deleteAll(Collection<?> collection) throws CacheWriterException {

    }
}


服务端启动类PersonStoreServer.java

package com.peidw.ignite;

import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteException;
import org.apache.ignite.Ignition;

/**
 * Created by ThinkPad on 2017-08-28.
 */
public class PersonStoreServer {
    public static void main(String[] args) throws IgniteException {
        Ignite ignite = Ignition.start("E:/Program Files (x86)/JetBrains/mywk/stud/igniteDemo/src/main/resources/Read-Through.xml");
    }
}

PersonStoreClient.java

package com.peidw.ignite;

import com.peidw.ignite.model.Person;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.IgniteException;
import org.apache.ignite.Ignition;
import org.apache.ignite.cache.query.QueryCursor;
import org.apache.ignite.cache.query.SqlFieldsQuery;

import java.util.List;

/**
 * 
 * Created by peidw on 2017-08-28.
 */
public class PersonStoreClient {
    public static void main(String[] args) throws IgniteException {
        Ignition.setClientMode(true);
        Ignite ignite = Ignition.start("E:\\Program Files (x86)\\JetBrains\\mywk\\stud\\igniteDemo\\src\\main\\resources\\Read-Through.xml");


        IgniteCache<Long, Person> cache = ignite.getOrCreateCache("personCache");
        cache.loadCache(null);
        QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery("select id, orgId,name from Person"));
        System.out.println(cursor.getAll());
        Person p=new Person(44,5,"CCED");
        cache.put(p.getId(),p);

        ignite.close();
    }
}


即可运行测试


官方文档,参考:https://www.zybuluo.com/liyuj/note/785629


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值