精华内容
下载资源
问答
  • 数据持久化

    千次阅读 2019-06-22 22:46:19
    数据持久化介绍 1、持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化“,而持久化的实现过程大多通过...
    数据持久化介绍

    1、持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以”固化“,而持久化的实现过程大多通过各种关系数据库来完成。
    2、持久化的主要应用是将内存中的数据存储在关系型数据库中,当然也可以存储在磁盘文件、xml数据文件中。

    在java中,数据库存取技术可以分为如下几类

    1、JDBC直接访问数据库。
    2、JDO技术。
    3、第三方O/R工具,如Hibernate、ibatis等。

    JDBC是java访问数据库的基石,JDO,Hibernate等只是封装了JDBC。

    JDBC基础

    1、JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统、通用的SQL数据库存取和操作的公共接口(一组API),定义了用来访问数据库的标准Java类库,使用这个类库可以以一种标准的方法、方便地访问数据库资源。
    2、JDBC为访问不同的数据库提供了一种同一的途径,为开发者屏蔽了一些细节问题。
    3、JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使的程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。
    在这里插入图片描述

    Driver接口

    1、Java.sql.Driver接口是所有JDBC驱动程序需要实现的接口。这个接口是提供给数据库厂商使用的,不同数据库厂商提供不同的实现。
    2、在程序中不需要直接去访问实现了Driver接口的类,而是由驱动程序管理器类(java.sql.DriverManager)去调用这些Driver实现。

    加载与注册JDBC驱动

    1、加载JDBC驱动需要调用Class类的静态方法forName(),向其传递要加载JDBC驱动的类名。
    2、DriverManager类是驱动程序管理器类,负责管理驱动程序。
    3、通常不用显示调用DriverManager类的registerDriver()方法来注册驱动程序类的实例,因为Driver接口的驱动程序类都包含了静态代码块,在这个静态代码块中,会调用DriverManager.registerDriver()方法来注册自身的一个实例。

    建立连接

    1、可以调用DriverManager类的getConnection()方法建立到数据库的连接。
    2、JDBC URL用于标识一个被注册的驱动程序,驱动程序管理器通过这个URL选择正确的驱动程序,从而建立到数据库的连接。
    3、JDBC URL的标准由三个部分组成,各部分间用冒号分隔。

    • jdbc:<子协议>:<子名称>。
    • 协议:JDBC URL中的协议总是jdbc。
    • 子协议:子协议用于标识一个数据库驱动程序。
    • 子名称:一种标识数据库的方法。子名称可以依不同的子协议而变化,用子名称的目的是为了定位数据库提供足够的信息。
    JDBC数据库连接池的必要性

    1、使用开发基于数据库的web程序时,传统的模式基本是按一下步骤:

    • 在主程序(如servlet、beans)中建立数据库连接。

    • 进行sql操作。

    • 断开书库连接。
      2、这种模式开发,存在的问题

    • 普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接的时候都要将Connection加载到内存中,再验证用户名和密码(带花费0.05s~1s的时间)。需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有的到很好的重复利用。若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

    • 对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将导致重启数据库。

    • 这种开发不能控制被创建的连接对象,系统资源会被毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

    数据库连接池

    1、为了解决传统开发中的数据库连接问题,可以采用数据库连接池技术。
    2、数据库连接池的基本思想就是为数据库连接建立一个”缓冲池“。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需要从”缓冲池“中取出一个,使用完毕之后再放回去。
    3、数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。
    4、数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。

    数据库连接池的工作原理

    在这里插入图片描述

    数据库连接池技术的优点

    1、资源重用

    • 由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

    2、更快的系统反应速度

    • 数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间。

    3、新的资源分配手段

    • 对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,是实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源。

    4、统一的连接管理,避免数据库连接泄露

    • 在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用的连接,从而避免了常规数据库连接操作中可能出现的资源泄露。
    两种开源的数据库连接池

    1、JDBC的数据库连接池使用java.sql.DataSource来表示,DataSource只是一个接口,该接口通常由服务器(Weblogic,WebSphere,Tomact)提供实现,也有一些开源组织提供实现:

    • DBCP数据库连接池。
    • C3P0数据库连接池。

    2、DataSource通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把DataSource称为连接池。

    DBCP数据源

    1、DBCP是Apache软件基金组织下的开源连接池实现,该连接池依赖组织下的另一个开源系统:Common-pool。如需使用该连接池实现,应在系统中增加如下两个jar文件:

    • Commons-dbcp.jar:连接池的实现。
    • Commons-pools.jar:连接池实现的依赖库。
      2、Tomact的连接池正式采用该链接池来实现的。改数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
    C3P0

    C3P0开源免费的连接池!目前使用它的开源项目有:Spring、Hibernate等。使用第三方工具需要导入jar包,C3P0使用时还需要添加配置文件c3p0-config.xml。
    需要导入的包:c3p0-0.9.2-pre5.jar、mchange-commons-java-0.2.3.jar。

    DBUtils增删改查的操作

    如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们将采用apache commons组件一个成员:DBUtils。
    DBUtils就是JDBC的简化开发工具包。需要使用技术:连接池(获得连接),SQL语句都没有多少。

    DBUtils概述

    DBUtils是java编程中的数据库操作使用工具,小巧简单实用。DBUtils封装了对JDBC的操作,简化了JDBC操作,可以少写代码。DBUtils三个核心功能介绍。

    • QueryRunner中提供对sql语句操作的API。
    • ResultSetHandler接口,用于定义select操作后,怎样封装结果集。
    • DBUtils类,它就是一个工具类,定义了关闭资源与事务处理的方法。
    QueryRunner和核心类
    • QueryRunner(DataSource ds),提供数据源(连接池),DBUtils底层自动维护连接connection。
    • update(String sql,Object …params),执行更新数据。
    • query(String sql,ResultSetHandler rsh,Object …params),执行查询。
    展开全文
  • C# 数据持久化

    千次阅读 2019-11-01 18:56:48
    当我们需要储存一些数据而不想下次重启被修改的话,就要持久化一些数据,我这里是在设置的时候,把一些设置的数据储蓄下来 用到的技术:BinaryFormatter 原理:使用序列化类把数据存放到文本中,下次使用的时候...

      当我们需要储存一些数据而不想下次重启被修改的话,就要持久化一些数据,我这里是在设置的时候,把一些设置的数据储蓄下来

    用到的技术:BinaryFormatter

    原理:使用序列化类把数据存放到文本中,下次使用的时候直接反序列化出来

    特点:使用简单,不需要学习json,xml等,也不需要学习如何读取储存文本

    附上代码

    private void Start()
        {
            if (File.Exists(path))
            {

            LoadPlayerData();

            }
          
        }
        
        //读取玩家的数据
        public PlayerData LoadPlayerData()
        {
            //如果路径上有文件,就读取文件
            if (File.Exists(path))
            {
                //读取数据
                BinaryFormatter bf = new BinaryFormatter();
                FileStream file = File.Open(path, FileMode.Open);
                playerData = (PlayerData)bf.Deserialize(file);
                file.Close();
            }
            //如果没有文件,就new出一个PlayerData
            else
            {
                playerData = new PlayerData();
            }    
            return playerData;
        }

        //保存玩家的数据
        public void SavePlayerData( )
        {
               playerData = new PlayerData(CreatePingCe.Datas);
            //保存数据      
            BinaryFormatter bf = new BinaryFormatter();
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            FileStream file = File.Create(path);
            bf.Serialize(file, playerData);
            file.Close();
          
        }

    就是这么简单,序列化类,存起来,反序列化,读出来就行了

     

    展开全文
  • Java 数据持久化系列之JDBC

    千次阅读 多人点赞 2019-11-26 20:39:56
    前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路。于是下定决心,集中精力学习了持久化相关框架的原理...

    前段时间小冰在工作中遇到了一系列关于数据持久化的问题,在排查问题时发现自己对 Java 后端的数据持久化框架的原理都不太了解,只有不断试错,因此走了很多弯路。于是下定决心,集中精力学习了持久化相关框架的原理和实现,总结出这个系列。

    上图是我根据相关源码和网上资料总结的有关 Java 数据持久化的架构图(只代表本人想法,如有问题,欢迎留言指出)。最下层就是今天要讲的 JDBC,上一层是数据库连接池层,包括 HikariCP 和 Druid等;再上一层是分库分表中间件,比如说 ShardingJDBC;再向上是对象关系映射层,也就是 ORM,包括 Mybatis 和 JPA;最上边是 Spring 的事务管理。

    本系列的文章会依次讲解图中各个开源框架的基础使用,然后描述其原理和代码实现,最后会着重分析它们之间是如何相互集成和配合的。

    废话不多说,我们先来看 JDBC。

    JDBC 定义

    JDBC是Java Database Connectivity的简称,它定义了一套访问数据库的规范和接口。但它自身不参与数据库访问的实现。因此对于目前存在的数据库(譬如Mysql、Oracle)来说,要么数据库制造商本身提供这些规范与接口的实现,要么社区提供这些实现。

    image.png

    如上图所示,Java 程序只依赖于 JDBC API,通过 DriverManager 来获取驱动,并且针对不同的数据库可以使用不同的驱动。这是典型的桥接的设计模式,把抽象 Abstraction 与行为实现Implementation 分离开来,从而可以保持各部分的独立性以及应对他们的功能扩展。

    JDBC 基础代码示例

    单纯使用 JDBC 的代码逻辑十分简单,我们就以最为常用的MySQL 为例,展示一下使用 JDBC 来建立数据库连接、执行查询语句和遍历结果的过程。

    public static void connectionTest(){
    
        Connection connection = null;
        Statement statement = null;
        ResultSet resultSet = null;
    
        try {
            // 1. 加载并注册 MySQL 的驱动
            Class.forName("com.mysql.cj.jdbc.Driver").newInstance();
    
            // 2. 根据特定的数据库连接URL,返回与此URL的所匹配的数据库驱动对象
            Driver driver = DriverManager.getDriver(URL);
            // 3. 传入参数,比如说用户名和密码
            Properties props = new Properties();
            props.put("user", USER_NAME);
            props.put("password", PASSWORD);
    
            // 4. 使用数据库驱动创建数据库连接 Connection
            connection = driver.connect(URL, props);
    
            // 5. 从数据库连接 connection 中获得 Statement 对象
            statement = connection.createStatement();
            // 6. 执行 sql 语句,返回结果
            resultSet = statement.executeQuery("select * from activity");
            // 7. 处理结果,取出数据
            while(resultSet.next())
            {
                System.out.println(resultSet.getString(2));
            }
    
            .....
        }finally{
            // 8.关闭链接,释放资源  按照JDBC的规范,使用完成后管理链接,
            // 释放资源,释放顺序应该是: ResultSet ->Statement ->Connection
            resultSet.close();
            statement.close();
            connection.close();
        }
    }
    
    

    代码中有详细的注释描述每一步的过程,相信大家也都对这段代码十分熟悉。

    唯一要提醒的是使用完之后的资源释放顺序。按照 JDBC 规范,应该依次释放 ResultSet,Statement 和 Connection。当然这只是规范,很多开源框架都没有严格的执行,但是 HikariCP却严格准守了,它可以带来很多优势,这些会在之后的文章中讲解。

    上图是 JDBC 中核心的 5 个类或者接口的关系,它们分别是 DriverManager、Driver、Connection、Statement 和 ResultSet。

    DriverManager 负责管理数据库驱动程序,根据 URL 获取与之匹配的 Driver 具体实现。Driver 则负责处理与具体数据库的通信细节,根据 URL 创建数据库连接 Connection。

    Connection 表示与数据库的一个连接会话,可以和数据库进行数据交互。Statement 是需要执行的 SQL 语句或者存储过程语句对应的实体,可以执行对应的 SQL 语句。ResultSet 则是 Statement 执行后获得的结果集对象,可以使用迭代器从中遍历数据。

    不同数据库的驱动都会实现各自的 Driver、Connection、Statement 和 ResultSet。而更为重要的是,众多数据库连接池和分库分表框架也都是实现了自己的 Connection、Statement 和 ResultSet,比如说 HikariCP、Druid 和 ShardingJDBC。我们接下来会经常看到它们的身影。

    接下来,我们依次看一下这几个类及其涉及的操作的原理和源码实现。

    载入 Driver 实现

    可以直接使用 Class#forName的方式来载入驱动实现,或者在 JDBC 4.0 后则基于 SPI 机制来导入驱动实现,通过在 META-INF/services/java.sql.Driver 文件中指定实现类的方式来导入驱动实现,下面我们就来看一下两种方式的实现原理。

    Class#forName 作用是要求 JVM 查找并加载指定的类,如果在类中有静态初始化器的话,JVM 会执行该类的静态代码段。加载具体 Driver 实现时,就会执行 Driver 中的静态代码段,将该 Driver 实现注册到 DriverManager 中。我们来看一下 MySQL 对应 Driver 的具体代码。它就是直接调用了 DriverManager的 registerDriver 方法将自己注册到其维护的驱动列表中。

    public class Driver extends NonRegisteringDriver implements java.sql.Driver {
        public Driver() throws SQLException {
        }
    
        static {
            // 直接调用 DriverManager的 registerDriver 将自己注册到其中
            DriverManager.registerDriver(new Driver());
        }
    }
    

    SPI 机制使用 ServiceLoader 类来提供服务发现机制,动态地为某个接口寻找服务实现。当服务的提供者提供了服务接口的一种实现之后,必须根据 SPI 约定在 META-INF/services 目录下创建一个以服务接口命名的文件,在该文件中写入实现该服务接口的具体实现类。当服务调用 ServiceLoader 的 load 方法的时候,ServiceLoader 能够通过约定的目录找到指定的文件,并装载实例化,完成服务的发现。

    DriverManager 中的 loadInitialDrivers 方法会使用 ServiceLoader 的 load 方法加载目前项目路径下的所有 Driver 实现。

    public class DriverManager {
        // 程序中已经注册的Driver具体实现信息列表。registerDriver类就是将Driver加入到这个列表
        private final static CopyOnWriteArrayList<DriverInfo> registeredDrivers = new CopyOnWriteArrayList<>();
        // 使用ServiceLoader 加载具体的jdbc driver实现
        static {
            loadInitialDrivers();
        }
        private static void loadInitialDrivers() {
            // 省略了异常处理
            // 获得系统属性 jdbc.drivers 配置的值
            String drivers = AccessController.doPrivileged(new PrivilegedAction<String>() {
                public String run() {
                    return System.getProperty("jdbc.drivers");
                }
            });
    
            AccessController.doPrivileged(new PrivilegedAction<Void>() {
                public Void run() {
    
                    ServiceLoader<Driver> loadedDrivers = ServiceLoader.load(Driver.class);
                    Iterator<Driver> driversIterator = loadedDrivers.iterator();
                    // 通过 ServiceLoader 获取到Driver的具体实现类,然后加载这些类,会调用其静态代码块
                    while(driversIterator.hasNext()) {
                        driversIterator.next();
                    }
                    return null;
                }
            });
    
            String[] driversList = drivers.split(":");
            // for 循环加载系统属性中的Driver类。
            for (String aDriver : driversList) {
                println("DriverManager.Initialize: loading " + aDriver);
                Class.forName(aDriver, true,
                        ClassLoader.getSystemClassLoader());
            }
        }
    }
    

    比如说,项目引用了 MySQL 的 jar包 mysql-connector-java,在这个 jar 包的 META-INF/services 文件夹下有一个叫 java.sql.Driver 的文件,文件的内容为 com.mysql.cj.jdbc.Driver。而 ServiceLoader 的 load 方法找到这个文件夹下的文件,读取文件的内容,然后加载出文件内容所指定的 Driver 实现。而正如之前所分析的,这个 Driver 类被加载时,会调用 DriverManager 的 registerDriver 方法,从而完成了驱动的加载。

    Connection、Statement 和 ResultSet

    当程序加载完具体驱动实现后,接下来就是建立与数据库的连接,执行 SQL 语句并且处理返回结果了,其过程如下图所示。

    建立 Connection

    创建 Connection 连接对象,可以使用 Driver 的 connect 方法,也可以使用 DriverManager 提供的 getConnection 方法,此方法通过 url 自动匹配对应的驱动 Driver 实例,然后还是调用对应的 connect 方法返回 Connection 对象实例。

    建立 Connection 会涉及到与数据库进行网络请求等大量费时的操作,为了提升性能,往往都会引入数据库连接池,也就是说复用 Connection,免去每次都创建 Connection 所消耗的时间和系统资源。

    Connection 默认情况下,对于创建的 Statement 执行的 SQL 语句都是自动提交事务的,即在 Statement 语句执行完后,自动执行 commit 操作,将事务提交,结果影响到物理数据库。为了满足更好地事务控制需求,我们也可以手动地控制事务,手动地在Statement 的 SQL 语句执行后进行 commit 或者rollback。

    connection = driver.connect(URL, props);
    // 将自动提交关闭
    connection.setAutoCommit(false);
    
    statement = connection.createStatement();
    statement.execute("INSERT INTO activity (activity_id, activity_name, product_id, start_time, end_time, total, status, sec_speed, buy_limit, buy_rate) VALUES (1, '香蕉大甩卖', 1, 530871061, 530872061, 20, 0, 1, 1, 0.20);");
    // 执行后手动 commit
    statement.getConnection().commit();
    

    Statement

    Statement 的功能在于根据传入的 SQL 语句,将传入 SQL 经过整理组合成数据库能够识别的执行语句(对于静态的 SQL 语句,不需要整理组合;而对于预编译SQL 语句和批量语句,则需要整理),然后传递 SQL 请求,之后会得到返回的结果。对于查询 SQL,结果会以 ResultSet 的形式返回。

    当你创建了一个 Statement 对象之后,你可以用它的三个执行方法的任一方法来执行 SQL 语句。

    • boolean execute(String SQL) : 如果 ResultSet 对象可以被检索,则返回的布尔值为 true ,否则返回 false 。当你需要使用真正的动态 SQL 时,可以使用这个方法来执行 SQL DDL 语句。
    • int executeUpdate(String SQL) : 返回执行 SQL 语句影响的行的数目。使用该方法来执行 SQL 语句,是希望得到一些受影响的行的数目,例如,INSERT,UPDATE 或 DELETE 语句。
    • ResultSet executeQuery(String SQL) : 返回一个 ResultSet 对象。当你希望得到一个结果集时使用该方法,就像你使用一个 SELECT 语句。

    对于不同类型的 SQL 语句,Statement 有不同的接口与其对应。

    接口介绍
    Statement适合运行静态 SQL 语句,不接受动态参数
    PreparedStatement计划多次使用并且预先编译的 SQL 语句,接口需要传入额外的参数
    CallableStatement用于访问数据库存储过程

    Statement 主要用于执行静态SQL语句,即内容固定不变的SQL语句。Statement每执行一次都要对传入的SQL语句编译一次,效率较差。而 PreparedStatement则解决了这个问题,它会对 SQL 进行预编译,提高了执行效率。

    PreparedStatement pstmt = null;
        try {
            String SQL = "Update activity SET activity_name = ? WHERE activity_id = ?";
            pstmt = connection.prepareStatement(SQL);
            pstmt.setString(1, "测试");
            pstmt.setInt(2, 1);
            pstmt.executeUpdate();
        }
        catch (SQLException e) {
        }
        finally {
            pstmt.close();
        }
    }
    

    除此之外, PreparedStatement 还可以预防 SQL 注入,因为 PreparedStatement 不允许在插入参数时改变 SQL 语句的逻辑结构。

    PreparedStatement 传入任何数据不会和原 SQL 语句发生匹配关系,无需对输入的数据做过滤。如果用户将”or 1 = 1”传入赋值给占位符,下述SQL 语句将无法执行:select * from t where username = ? and password = ?。

    ResultSet

    当 Statement 查询 SQL 执行后,会得到 ResultSet 对象,ResultSet 对象是 SQL语句查询的结果集合。ResultSet 对从数据库返回的结果进行了封装,使用迭代器的模式可以逐条取出结果集中的记录。

    while(resultSet.next()) {
        System.out.println(resultSet.getString(2));
    }
    

    ResultSet 一般也建议使用完毕直接 close 掉,但是需要注意的是关闭 ResultSet 对象不关闭其持有的 Blob、Clob 或 NClob 对象。 Blob、Clob 或 NClob 对象在它们被创建的的事务期间会一直持有效,除非其 free 函数被调用。

    个人博客,欢迎来玩

    参考

    • https://blog.csdn.net/wl044090432/article/details/60768342
    • https://blog.csdn.net/luanlouis/article/details/29850811
    展开全文
  • Mybatis数据持久化

    千次阅读 2019-10-22 21:09:05
    我们开发中ssm 中的Mybatis框架是我们的数据持久化层。那么这个持久化怎么理解呢? 我们可不可单出的理解是将内存中的存储到我们的MySQL数据库或者其他数据库,能够使数据永久保存,我觉得可以聊一聊这个Mybatis的...

    Mybatis框架的简介:https://blog.csdn.net/qq_42963930/article/details/102556756

    我们开发中ssm 中的Mybatis框架是我们的数据持久化层。那么这个持久化怎么理解呢?
    我们可不可单出的理解是将内存中的存储到我们的MySQL数据库或者其他数据库,能够使数据永久保存,我觉得可以聊一聊这个Mybatis的持久化到底指的是什么。

    持久化就是将数据保存到硬盘、网络云盘(例如百度云)、U盘等等永久保存的设备。这种将内存中的数据保存到关系型数据库、文件系统、消息队列(activeMQ)等持久化设备中。持久层就是系统专注于实现数据持久化的相对独立的局面。

    持久层设计的目标包括:

    1、数据存储的逻辑分离,并且提供抽象化的数据访问接口
    2、数据访问底层实现的分离, 指不修改代码的情况下修改底层的实现   /就是说我们数据库的升级 更新迭代都不影响数据的查询,MySQL换成Oracle数据一样存在。
    3、资源管理和调度的分离
    4、数据抽象,提供面向对象的数据操作
    
    展开全文
  • Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化。 Redis支持两种方式的持久化,可以单独使用其中一种或将二者...
  • OpenShift 数据持久化

    千次阅读 2018-05-28 22:06:53
    OpenShift中为了满足数据持久化需求,采用了 kubernates 的 persistence volume 框架,在 kubenates 中的这个 persistence volume 子系统则为集群用户和管理员提供了一套API,这套API对底层的持...
  • Redis数据持久化机制及数据恢复

    千次阅读 2019-12-29 15:50:27
    什么是数据持久化? 我们知道Redis是基于内存的非关系型数据库,对数据的增删改查操作都直接在内存中进行,再加上Redis不用维护数据之间的“关系”,导致它性能很高,速度很快。 但是基于内存有一个问题是:一旦机器...
  • 为什么要实现数据持久化? 比如:对象Student中有参数name、sex、age等,在应用开发中可以创建一个Student对象并给其参数赋值,该方式用于存储暂时\瞬时的数据,当退出程序或资源被回收后所保存的数据就消失了,...
  • vuex数据持久化

    千次阅读 2020-01-08 17:39:52
    vuex状态持久化 1 . 安装 npm install vuex-persistedstate 2 . 在store.js里 import createPersistedState from 'vuex-persistedstate' const state = { user:{}, } export default new Vuex.Store({ ...
  • k8s grafana数据持久化

    千次阅读 2019-05-10 15:59:55
    问题:k8s搭建的grafana容器只要一重启,配置的dashboard,添加的用户等就会重置,从而得出,grafana没有数据持久化。 解决: 1.先在集群建立持久花存储pvc 然后挂在到容器/var目录 volumeMounts: - mountPath:...
  • 手动修改配置 由于工作是基于k8s平台的,但是单独部署Prometheus监控系统的各个组件过程又比较繁琐,所以使用了coreos开发的自动部署项目kube-...1. Kube-prometheus数据持久化 配置条件:部署了ceph存储的k8s集...
  • Android数据持久化——五种方式

    万次阅读 2018-06-23 15:06:42
    Android提供五种持久化数据存储的方式:Shared Preferences、Internal Storage、External Storage、SQLite Databases和Network Connection。 一、Shared Preferences 一个轻量级的存储类,特别适合用于保存软件...
  • (八)React实现数据持久化

    千次阅读 2019-09-26 16:31:44
    –首先封装一个数据持久化的组件 var storage={ set(key, value){//增加 localStorage.setItem(key, JSON.stringify()); }, get(key){//获取 return JSON.parse(localStorage.getItem(key)); }, r...
  • Kafka-数据持久化

    千次阅读 2019-09-23 16:33:53
    有一普遍的认识:磁盘很慢—这让人们怀疑使用磁盘作为持久化的性能。实际上,磁盘是快还是慢完全取决于我们是如何使用它。 就目前来说,一个 6块 7200rpm SATA RAID-5磁盘线性(顺序)写入的性能能达到600MB/sec,而...
  • Prometheus数据持久化Influxdb

    千次阅读 2020-08-05 09:39:07
    查看 /var/lib/influxdb 目录 目录 描述 data 存放最终存储的数据,文件以.tsm结尾 meta 存放数据库元数据 wal 存放预写日志文件 配置文件路径 :/etc/influxdb/influxdb.conf 1.4 创建http接口用于prometheus 2....
  • Docker容器数据持久化

    万次阅读 2019-03-25 13:24:20
    默认情况下,container内部新创建...当container消失时,与container一体的可读写层也一并消失,数据并没有持久化。并且,当一个container需要其它container中可读写层的数据时,取出操作非常困难。 container的...
  • redis中数据持久化问题

    千次阅读 2018-07-27 00:57:19
    分别采用了2中形式进行数据持久化操作:RDB模式和AOF模式。大量数据的持久化必然涉及到内存的整理,在另一篇文章中有介绍https://blog.csdn.net/sunroyfcb/article/details/81212588。  RDB模式是...
  • Mybatis实现数据持久化的三种方式

    千次阅读 2019-01-01 17:09:51
    Mybatis实现数据持久化有三种方式,下面一一道来: 1.单纯的基于xml方式: 这种方式实现实现数据持久化有7个步骤: 1) 使用idea创建maven工程: 2) 在pom.xml文件中加入三个依赖:Mybatis自己的jar包,mysql数据库...
  • Docker 数据持久化的三种方案

    千次阅读 2019-07-19 10:47:55
    Docker数据持久化 容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题: 数据不是持久化。意思是如果容器删除了,这些数据也就没了 主机上的其它进程不方便访问这些数据 对这些数据的I/O会经过存储...
  • Redux实现数据持久化两步骤快速完成

    千次阅读 2019-10-14 20:51:57
    vuex有数据持久化插件,redux有没有呢?答案是肯定的。那就是简单易用的redux-persist,官网链接 两步走起! 一,配置我们的创建store的文件 store/index.js import { createStore, applyMiddleware, compose } from...
  • 数据持久化 1.可以发现,helowin 的实例安装在:/home/oracle/app/oracle/oradata/helowin 目录下 2.拷贝数据到本地,并修改拥有者 docker cp oracle:/home/oracle/app/oracle/oradata/helowin /usr/local/docker/...
  • Redis详解(3)数据持久化机制

    万次阅读 多人点赞 2019-06-03 11:06:04
    Redis由于支持非常丰富的内存数据结构类型,如何把这些复杂的内存组织方式持久化到磁盘上是一个难题,所以Redis的持久化方式与传统数据库的方式有比较多的差别,Redis一共支持四种持久化方式,分别是: RDB定时快照...
  • Android实现数据持久化的三种方法

    千次阅读 2017-10-02 21:05:23
    关于Android实现数据持久化的三种方法。
  • 使用Docker部署MySQL(数据持久化

    千次阅读 2018-12-28 19:46:24
    原文链接:...&nbsp; 本文简述如何使用Docker部署mysql,同时持久化数据.我们会用到tutum-docker-mysql&nbsp;这个项目来搭建一个mysql,省去重...
  • NameNode元数据持久化

    千次阅读 2017-12-04 20:58:40
    NameNode在内存中保存着整个文件系统的名字空间和文件数据块映射(Blockmap)的映像。 如果NameNode宕机,那么整个集群就瘫痪了 因而则出现了元数据的存储问题,接下来请看如下几个问题 如果元数据仅以文件的形式...
  • ReactNative数据持久化的五种方式

    千次阅读 2018-03-28 17:58:09
    使用JS写App完全是一种不一样的感受,思维方式跟OC编程很不尽相同,这篇文章主要来说说使用ReactNative的时候,数据是怎么存储的,也就是ReactNative数据持久化有哪些方案。总结的主流开发中一共有5种方案。如果有更...
  • Vuex实现数据持久化,数据刷新消失解决方案 为什么会有vuex数据持久化这么一说呢? 在开发中,有一些全局数据,比如用户数据,系统数据等。这些数据很多组件中都会使用,我们当然可以每次使用的时候都去请求,但是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 597,868
精华内容 239,147
关键字:

数据持久化