如何从持久化存储中读取数据
发布网友
发布时间:2022-04-20 07:36
我来回答
共4个回答
热心网友
时间:2022-04-09 07:33
对于数据的持久化存储,ios中一般提供了4种不同的机制。
1.属性列表
2.对象归档
3.数据库存储(SQLite3)
4.苹果公司提供的持久性工具Core Data。
其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。
也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。
1》文件如何存储(如上面4点)
2》文件存储在哪里。
对于数据的操作,其实我们关心的是操作的速率。
就好比在Adnroid中偏好存储,数据库存储,io存储一样。
热心网友
时间:2022-04-09 08:51
首先建一个文本文件,比如在D盘根目录下,名字为:int.txt,然后写一个Java类CalcNumber.java。****************************************************************int.txt里面的文本如下:1 2 3 4 5 6 7 8 9 1011 12 13 14 15 16 17 18 19 2021 22 23 24 25 26 27 28 29 3031 32 33 34 35 36 37 38 39 4041 42 43 44 45 46 47 48 49 50****************************************************************CalcNumber.java类代码如下:import java.awt.BorderLayout;import java.awt.Dimension;import java.awt.GridLayout;import java.awt.Toolkit;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.io.BufferedReader;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.IOException;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.UIManager;public class CalcNumber extends JFrame { JTextArea in; JTextArea suText; JTextArea heText; public CalcNumber() { this.setTitle("计算素数和合数"); // 输入框 in = new JTextArea(4, 1); in.setAutoscrolls(true); JScrollPane inScroll = new JScrollPane(in); in.setBorder(BorderFactory.createBevelBorder(1)); JPanel upper = new JPanel(new BorderLayout()); upper.add(inScroll); // 按钮 JButton imp = new JButton("导入文本"); imp.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { try { BufferedReader br = new BufferedReader(new FileReader( "d:\\int.txt")); String s; while ((s = br.readLine()) != null) { in.setText(in.getText() + "\n" + s); } br.close(); } catch (FileNotFoundException e1) { e1.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } } }); JButton start = new JButton("启动两个线程并计算"); start.addActionListener(new CalcActionListener()); JPanel buttonP = new JPanel(); buttonP.add(imp); buttonP.add(start); // 结果 JPanel result = new JPanel(new GridLayout(1, 2)); JPanel suPanel = new JPanel(); suPanel.setBorder(BorderFactory.createTitledBorder("以下为素数")); JPanel hePanel = new JPanel(); hePanel.setBorder(BorderFactory.createTitledBorder("以下为合数")); result.add(suPanel); result.add(hePanel); suText = new JTextArea(4, 25); JScrollPane suScroll = new JScrollPane(suText); suText.setBorder(BorderFactory.createBevelBorder(1)); heText = new JTextArea(4, 25); JScrollPane heScroll = new JScrollPane(heText); heText.setBorder(BorderFactory.createBevelBorder(1)); suPanel.add(suScroll); hePanel.add(heScroll); // 总 JPanel all = new JPanel(new GridLayout(2, 1, 2, 2)); all.setBorder(BorderFactory.createTitledBorder("计算素数和合数")); all.add(upper); all.add(result); this.add(buttonP, BorderLayout.SOUTH); this.add(all, BorderLayout.CENTER); // this.setSize(400, 300); this.pack(); Toolkit tool = Toolkit.getDefaultToolkit(); Dimension screen = tool.getScreenSize(); this.setLocation(screen.width / 2 - this.getWidth() / 2, screen.height / 2 - this.getHeight() / 2); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } class CalcActionListener implements ActionListener, Runnable { public void actionPerformed(ActionEvent e) { Thread suThread = new Thread(new CalcActionListener(), "su"); Thread heThread = new Thread(new CalcActionListener(), "he"); suThread.start(); heThread.start(); } public void run() { String s = in.getText(); String[] arr = s.split("\\s"); StringBuffer su = new StringBuffer(); StringBuffer he = new StringBuffer(); for (int i = 0; i < arr.length; i++) { boolean flag = false; if (!arr[i].equals("") && arr[i] != null) { int n = Integer.valueOf(arr[i]); for (int j = 2; j < n; j++) { if (n % j == 0) { flag = true; } } if (Thread.currentThread().getName().equals("su") && flag == false) { su = su.append(" " + n); } if (Thread.currentThread().getName().equals("he") && flag == true) { he = he.append(" " + n); } } } if (Thread.currentThread().getName().equals("su")) { suText.setText(new String(su)); } else { heText.setText(new String(he)); } } } public static void main(String[] args) throws Exception { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); CalcNumber c = new CalcNumber(); }}****************************************************************运行结果如下:
热心网友
时间:2022-04-09 10:26
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 中指定了以下依赖项 :
<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。
热心网友
时间:2022-04-09 12:17
MySQL 8 之前,使用的动态变量不是永久性的,并且在重启后会重置。可在运行时使用 SET 语句更改这些变量,以影响当前实例的操作,但是我们必须手动更新 my.cnf 配置文件以使其持久化。
在许多情况下,从服务端更新 my.cnf 并不是一个方便的选择,并且使变量仅被更新才能在后续重新启动时动态还原,而没有任何历史记录。
持久化系统变量是 MySQL 8 中引入的功能之一。新功能可帮助 DBA 动态更新变量并注册它们,而无需从服务器端访问配置文件。
如何持久化全局系统变量?
与 SET GLOBAL 一样,SET PERSIST 是可用于在运行时更新系统变量并使它们在重新启动后保持不变的命令。当我们使用 PERSIST 关键字时,变量更改将更新到数据目录中的 mysqld-auto.cnf 选项文件。mysqld-auto.cnf 是仅在第一次执行 PERSIST 或 PERSIST_ONLY 语句时创建的 JSON 格式文件。