如何从持久化存储中读取数据
1.Sample PERSON Table
首先我数据库PERSON数据:
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 指定依赖项 :
org.apache.ignite
ignite-core
1.5.0.final
org.apache.ignite
ignite-spring
1.5.0.final
mysql
mysql-connector-java
5.1.6
4.Read-Through配置
数据库加载数据需要启用 read-through 模式设置CacheConfigurationcacheStoreFactory属性pring XML配置文件或程序设置些值
...
5.实现CacheStore
现我我模型Maven依赖关系缓存已配置位现候实现存储若数据库加载数据应实现CacheStore接口 loadCache() load()
public class PersonStore implements CacheStore {
@SpringResource(resourceName = "dataSource")
private DataSource dataSource;
// This method is called whenever IgniteCache.loadCache() method is called.
@Override
public void loadCache(IgniteBiInClosure 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用户提供些具默认实现CacheStoreCacheStoreAdapter类—— 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 cache = ignite.getOrCreateCache("personCache")) {
// Load cache with data from the database.
cache.loadCache(null);
// Execute query on cache.
QueryCursor cursor = cache.query(new SqlFieldsQuery(
"select id, name from Person"));
System.out.println(cursor.getAll());
}
}
}
}
7.始Ignite集群
命令shell使用面命令自安装Ignite文件夹并启服务器节点:
$ bin/ignite.sh
确保personstore.java类路径Ignite做设置USER_LIBS环境变量或项目jar放入Ignite安装libs文件夹
8.输
IDE运行PersonStoreExample.java
K
长期存储数据,即把数据(如内存中的)保存到可永久保存的存储设备中(如硬盘、U盘),也就是人们常说的持久化。
常用持久化的方案有数据库、XML文件和文件存储。
数据库是按照数据结构来存储和管理数据的仓库,后文不再做详细介绍。
XML是可扩展标记语言,最早是为了简化Internet的文档数据传输,它提供统一的语法格式来描述数据的结构,通常XML文件用于一些少量且无特殊类型要求的文本存储。示例代码使用W3C标准的接口生成XML:
import java.io.FileOutputStream;import java.io.PrintWriter;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.OutputKeys;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;public class $ { public static void main(String[] args) throws Exception { Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument(); //创建根节点为students的XML文件 Element students = document.createElement("students"); document.appendChild(students); //在根节点下创建一个子节点学生 Element student = document.createElement("student"); students.appendChild(student); //创建节点学生姓名,值为张三 Element name = document.createElement("name"); name.appendChild(document.createTextNode("张三")); student.appendChild(name); //创建节点学生年龄,值为18 Element age = document.createElement("age"); age.appendChild(document.createTextNode("18")); student.appendChild(age); //创建节点学生编号,值为150101 Element number = document.createElement("number"); number.appendChild(document.createTextNode("150101")); student.appendChild(number); //在根节点下创建第二个子节点学生 student = document.createElement("student"); students.appendChild(student); //创建节点学生姓名,值为李四 name = document.createElement("name"); name.appendChild(document.createTextNode("李四")); student.appendChild(name); //创建节点学生年龄,值为20 age = document.createElement("age"); age.appendChild(document.createTextNode("20")); student.appendChild(age); //创建节点学生编号,值为150102 number = document.createElement("number"); number.appendChild(document.createTextNode("150102")); student.appendChild(number); //将XML文件保存到硬盘 Transformer transformer = TransformerFactory.newInstance().newTransformer(); transformer.setOutputProperty(OutputKeys.ENCODING, "utf-8"); transformer.setOutputProperty(OutputKeys.INDENT, "yes"); PrintWriter writer = new PrintWriter(new FileOutputStream("/home/test.xml")); transformer.transform(new DOMSource(document), new StreamResult(writer)); }} 无论是数据库还是XML文件,它们都使用了能让数据快速方便进出的标准规范。其它文件如propeties、json,都可以使用类似XML的方式来打包数据,然后通过Java丰富的io流接口保存到磁盘中。
首先,这是我数据库中PERSON的数据:
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。
对于数据的持久化存储,ios中一般提供了4种不同的机制。
1.属性列表
2.对象归档
3.数据库存储(SQLite3)
4.苹果公司提供的持久性工具Core Data。
其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。
也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。
1》文件如何存储(如上面4点)
2》文件存储在哪里。
对于数据的操作,其实我们关心的是操作的速率。
就好比在Adnroid中偏好存储,数据库存储,io存储一样。
1.Sample PERSON Table
首先,这是我数据库中PERSON的数据:
2.模型
这是一个Person.java类对应数据库中PERSON表的例子。
public class Person {
private long id;
private long orgId;
private String name;
private int salary;
// Constructor
…
// Getter and Setter methods
…
}
Redis的持久化机制 (RDB&AOF&混合模式)
AOF AOF 默认的保存文件为 appendonly.aof,它的优点是存储频率更高,因此 丢失数据的风险就越低 ,并且 AOF 并不是以二进制存储的,所以它的存储信息更易懂。缺点是 占用空间大 , 重启之后的数据恢复速度比较慢 。混合 在 Redis 4.0 就推出了混合持久化的功能。Redis 混合持久化的存储模式是, ...
什么是无痕浏览?怎么开启无痕模式?
浏览过程中这些内容是缓存形式存在,当你关闭浏览器,或者缓存空间不够时,都会将这些信息持久化存储。无痕浏览的记录存储方式 开启了无痕浏览后,其存储过程会有变化,主要是取消了持久化存储这一步骤,也就是说在你浏览的过程中,当缓存不够使,会自动丢弃或销毁之前的浏览记录,当结束浏览,关闭浏览器...
JavaScript中的本地存储,看这一篇就够了!
在JavaScript编程中,理解本地存储对于数据持久化至关重要。本文将介绍三种主要的本地存储方式:localStorage、sessionStorage和cookie,它们各自具有独特的特点。首先,localStorage是一种持久化的存储机制,支持保存、获取和删除数据,适合存储大量数据且不需要实时更新的情况。相比之下,sessionStorage的生命周期与...
redis这些内存消耗数据怎么看呢,主要看哪个说明内存比较大了
Redis由于支持非常丰富的内存数据结构类型,如何把这些复杂的内存组织方式持久化到磁盘上是一个难题,所以Redis的持久化方式与传统数据库的方式有比较多的差别,Redis一共支持四种持久化方式,分别是:在设计思路上,前两种是基于全部数据都在内存中,即小数据量下提供磁盘落地功能,而后两种方式则是作者在尝试存储数据超过物理...
...Transactional Memory ——关键词:持久事务内存
在内存管理方面,Romulus关注于事务恢复期间的挑战,确保在持久内存区域的正确维护。它不依赖特定的垃圾收集器,而是与各种内存分配器兼容,提供了灵活且高效的数据存储方式。Lea的顺序分配器被巧妙地运用,通过persist包装器,确保每次数据存储后自动调用pwb,从而实现内存操作的持久化控制。在API设计上,Romulus...
刚刚问我,redis持久化数据到数据库是怎么操作的
Redis自动快照保存到磁盘或者调用bgsave,是后台进程完成的,其他客户端仍然和可以读写redis服务器,后台保存快照到磁盘会占用大量内存。调用save保存内存中的数据到磁盘,将阻塞客户端请求,直到保存完毕。调用shutdown命令,Redis服务器会先调用save,所有数据持久化到磁盘之后才会真正退出。对于数据丢失的问题:...
redis和mysql有什么区别呢
redis和mysql的区别非常大。具体如下:mysql中一个中小型的网络数据库,比oracle和sqlserver小, 但是并发能力远超过acess这样的桌面数据库。redis是一个支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。可以认为redis比mysql简化很多。mysql支持集群。现在大量的软件使用redis作为mysql在本地的数据...
Redis持久化
·RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。针对RDB不适合实时持久化的问题,Redis提供了AOF持久化方式来解决。 5.2 AOF AOF(append only file)持久化:以独立日志的方式记录每次写命令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。
简述保存硬盘上的程序在计算机内的运行过程?
首先呢文件系统的访问需要OS的支持,显卡是不能绕过OS直接读写硬盘的,因此如果显存中的数据需要持久化存储,那么OS就要对驱动程序提供接口,在休眠事件发生的时候通知所有设备开始持久化他们的ram(如果这个设备有ram的话)。这个接口要么是设备将数据复制到计算机主存中然后通过os本身对主存数据的备份来实现...
java mapper是什么意思?
Java Mapper是什么?Java Mapper是MyBatis框架中的一个重要组件,它主要用于将数据库表中的记录映射到Java对象上。简单来说,Java Mapper就是一个实现了数据持久化逻辑的接口,它提供了一系列方法,用于执行CRUD操作,即增、删、改、查。Java Mapper的使用 在Java应用程序中使用Mapper,通常需要定义一个...
关张双氯: 1.Sample PERSON Table 首先我数据库PERSON数据: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....
黄埔区17147407861: 如何通过storm从hbase中读取数据 - ?
关张双氯: t对tuple进行处理之后,通常要将数据缓存到redis,memcached等内存数据库中,对于数据量小的,可以缓存到内存中,但是对于大量持久化的数据,更多时候需要存储到分布式存储系统中,这里我选择HBase用于存储结果.参照官方文档,storm提供storm-hbase项目用于集成storm-hbasegithub /github.com/ptgoetz/storm-hbaseclone之后需要修改maven依赖的软件版本,其中hbase采用是0.98版本,但是我的测试环境是1.0.0版本,两个版本的API差别还是有
黄埔区17147407861: kafka获取数据的几种方式 - ?
关张双氯: 一、基于Receiver的方式这种方式使用Receiver来获取数据.Receiver是使用Kafka的高层次Consumer API来实现的.receiver从Kafka中获取的数据都是存储在Spark Executor的内存中的,然后Spark Streaming启动的job会去处理那些数据....
黄埔区17147407861: 从关系数据库中读取数据是否属于持久化? - ?
关张双氯: 严格来说应该不算.一般说持久化是一种对象服务,就是把内存中的对象保存到外存(比如硬盘)中,让以后能够取回,侧重点在保存而不是读取.
黄埔区17147407861: 数据在内存中是如何存储到的?又是如何读取的? - ?
关张双氯: 应该是你的卡有问题了,在相机上如果能看到,说明照片存储区还在,可能是IO读取部分有毛病,也可能是接触不良之类的.我建议,如果照片不重要,格式化一下存储卡看看是否回复正常.如果舍不得照片又不多,可以试着从卡片导入机身内存储空间,机内大概有几十m内存,然后再导回格式化的好卡中.
黄埔区17147407861: hbase里的hlog存在哪?regionserver里还是zookeeper里??
关张双氯: <p>看一下下图就知道了吧.</p> <p></p> <p>对于用户的一个表比如Blog,可能包括数据多达亿级</p> <p>该表的数据可以分布在多个HRegion</p> <p>而每个HRegion保存表的某一段数据</p> <p>UserTable (1)------HRegion(*)</p> <p>对于多...
黄埔区17147407861: redis数据持久化到到磁盘还是数据库? - ?
关张双氯: redis本身数据存储在内存中,如果断电,数据会都没有,所以需要把数据保存在磁盘中,才能保存长久,这个就是持久化了,是保存在磁盘中呢
黄埔区17147407861: 本地保存数据的方式? - ?
关张双氯: 可以对数据进行持久化,实体类实现Serilizable接口..保存的时候可以把持久化数据存储在文件中,恢复的时候也是读取文件大致读取出来是这样的:FileInputStream fis= new FileInputStream(file);ObjectInputStream ois= new ObjectInputStream(fis);Object obj=ois.readObject();ois.close();fis.close();
黄埔区17147407861: C# 多线程 大量数据实时接收\解析\存储 问题 - ?
关张双氯: 1、定义两个线程安全的队列(System.Collections.Concurrent.ConcurrentQueue<T>)a跟b,其中a用于储存接受的数据,b用于储存要持久化的数据. 2、线程A循环读取数据并储存到队列a中. 3、线程B循环从队列a中读取数据.3.1、如果读...
黄埔区17147407861: C#中,我想持久化一泛型集合里的数据,写入文件中,怎样读出来转化成原来的类型?
关张双氯: 序列化 反序列化 操作即可.