转载

Apache Ignite:如何从持久化存储中读取数据

原文: Apache Ignite: How to Read Data From Persistent Store
作者: Dmitriy Setrakyan
责编: 孙思,关注数据库领域,寻求报道或者投稿请发邮件sunsi@csdn.net,另有「CSDN 高级数据库技术群」,内有诸多知名互联网公司的大牛,欢迎加微信sunlovesi申请入群,备注姓名+公司+职位。

数据可以直接从任何持久存储区加载到Apache Ignite缓存。这个例子展示了如何从一个MySQL数据库加载数据到另一个Ignite分布式缓存。在这里,假设你已经在你的系统上安装了Apache Ignite。如果没有,你可以先通过本教程学习下。

1.Sample PERSON Table

首先,这是我数据库中PERSON的数据:

Apache Ignite:如何从持久化存储中读取数据

2.模型

这是一个Person.java类对应数据库中PERSON表的例子。

public class Person {      private long id;      private long orgId;      private String name;      private int salary;      // Constructor// Getter and Setter methods      …  }

3.Maven Dependency

我已在我的项目 pom.xml 中指定了以下依赖项 :

<dependency>      <groupid>org.apache.ignite</groupid>      <artifactid>ignite-core</artifactid>      <version>1.5.0.final</version>  </dependency>  <dependency>      <groupid>org.apache.ignite</groupid>      <artifactid>ignite-spring</artifactid>      <version>1.5.0.final</version>  </dependency>  <dependency>      <groupid>mysql</groupid>      <artifactid>mysql-connector-java</artifactid>      <version>5.1.6</version>  </dependency>

4.Read-Through配置

从数据库中加载数据,你需要启用 read-through 模式和设置CacheConfiguration的cacheStoreFactory属性。你可以在pring XML配置文件或程序中设置这些值。

<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/mydbname"></property>      <property name="username" value="username"></property>      <property name="password" value="passwd"></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>                  <!-- Enable readThrough-->                  <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="myexamples.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="ignite.myexamples.model.Person"></property>                              <property name="fields">                                  <map>                                      <entry key="id" value="java.lang.Long"></entry>                                      <entry key="name" value="java.lang.String"></entry>                                      <entry key="orgId" value="java.lang.Long"></entry>                                      <entry key="salary" value="java.lang.Integer"></entry>                                  </map>                              </property>                          </bean>                      </list>                  </property>              </bean>          </list>      </property>      <property name="peerClassLoadingEnabled" value="true"></property>      <!-- Other Ignite configurations-->      ...  </bean>

5.实现CacheStore

现在我们有我们的模型,Maven依赖关系和缓存已配置到位,那么,现在是时候来实现存储。若从数据库加载数据,应实现CacheStore接口的 loadCache()和 load()的方法。

public class PersonStore implements CacheStore<Long, Person> {      @SpringResource(resourceName = "dataSource")      private DataSource dataSource;      // This method is called whenever IgniteCache.loadCache() method is called.      @Override      public void loadCache(IgniteBiInClosure<Long, Person> clo, @Nullable Object... objects) throws CacheLoaderException {          System.out.println(">> Loading cache from store...");          try (Connection conn = dataSource.getConnection()) {              try (PreparedStatement st = conn.prepareStatement("select * from PERSON")) {                  try (ResultSet rs = st.executeQuery()) {                      while (rs.next()) {                          Person person = new Person(rs.getLong(1), rs.getLong(2), rs.getString(3), rs.getInt(4));                          clo.apply(person.getId(), person);                      }                  }              }          }          catch (SQLException e) {              throw new CacheLoaderException("Failed to load values from cache store.", e);          }      }      // This method is called whenever IgniteCache.get() method is called.      @Override      public Person load(Long key) 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, key.toString());                  ResultSet rs = st.executeQuery();                  return rs.next() ? new Person(rs.getLong(1), rs.getLong(2), rs.getString(3), rs.getInt(4)) : null;              }          }          catch (SQLException e) {              throw new CacheLoaderException("Failed to load values from cache store.", e);          }      }      // Other CacheStore method implementations.      …  }

为了方便起见,Ignite还为用户提供了一些具有默认实现CacheStore方法的CacheStoreAdapter类—— loadAll()、writeAll()和deleteAll()。

6.加载缓存

这是一个PersonStoreExample.java类调用IgniteCache.loadCache()方法,在内部将调用CacheStore.loadCache()方法的示例(在上一步中我们实现了)。

public class PersonStoreExample {      public static void main(String[] args) throws IgniteException {          Ignition.setClientMode(true);          try (Ignite ignite = Ignition.start("config/cluster-config.xml")) {              try (IgniteCache<Long, Person> cache = ignite.getOrCreateCache("personCache")) {                  // Load cache with data from the database.                  cache.loadCache(null);                  // Execute query on cache.                  QueryCursor<List<?>> cursor = cache.query(new SqlFieldsQuery(                          "select id, name from Person"));                  System.out.println(cursor.getAll());              }          }      }  }

7.开始Ignite集群

从命令shell中,使用下面的命令,自己安装Ignite文件夹并启动服务器节点:

$ bin/ignite.sh <path-to-Spring-XML-configuration-file>

确保personstore.java是在类路径中Ignite。这样做,你可以设置USER_LIBS环境变量,或将项目jar放入Ignite安装的libs文件夹中。

8.输出

从你的IDE,运行PersonStoreExample.java。

Apache Ignite:如何从持久化存储中读取数据

更多的信息和文档,用户可以访问 ApacheIgnite网站 。

原文  http://geek.csdn.net/news/detail/79314
正文到此结束
Loading...