h5缓存之数据库

/*=======================================================
    函数功能:保存日志到本地数据库
=======================================================*/
function saveLog(str)
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);

    // 创建或打开数据库失败
    if(!db) { return; }

    // 创建表
    db.transaction(function(tx) {
     tx.executeSql("CREATE TABLE if not exists log (createtime TEXT, content TEXT)");
    });

    // 插入记录
    db.transaction(function(tx) {
     tx.executeSql("INSERT INTO log (createtime, content) values(?, ?)", [new Date().Format("yyyyMMdd hh:mm:ss"), str], null, null);
    });
}

/*=======================================================
    函数功能:查询本地数据库里的日志信息
=======================================================*/
function selectLog(sql)
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);
    // 创建或打开数据库失败
    if(!db) { return; }

    // 查询数据
    db.transaction(function(tx)
    {

        if(sql == undefined || sql == "") { sql = "SELECT * FROM log"; }

        tx.executeSql(sql, [], function(tx, result)
      {
        for(var i = 0; i < result.rows.length; i++)
        {
            console.warn( result.rows.item(i)[‘content‘]);
        }
      },
      function()
      {
          console.error("查询失败! 原因:1、没有创建表; 2、表中无数据");
         });
    });
}

/*=======================================================
    函数功能:清空数据库表数据
=======================================================*/
function clearLog()
{
    var db = window.openDatabase("web", "1.1", "log", 1024 * 1024);
    // 创建或打开数据库失败
    if(!db) { return; }

    db.transaction(function(tx) {
     tx.executeSql("DROP TABLE log");
    });

}

1.需求背景:当用户在页面上添加一行一行的数据时,突然发现网络断掉了,页面上编辑的数据没法保存进数据库,所以需要一个本地端的临时保存功能,以便在网络通畅后重新加载出来!

2.解决方案:

结合网上搜刮,考虑到了这几种方式:1)采用cookie; 2)看能不能采用浏览器的页面缓存来模拟 3)使用html5

1)cookie使用(做测试是直接用浏览器打开没有效果,需要放到站点下)

所有浏览器都支持,所以不需要去考虑兼容性的问题;

浏览器对于同一domain最多支持20个左右cookie,每个cookie的长度也有限制,超长部分就会被截掉

过期的限制:在cookie的生命周期内有效,过期就会被清掉

还有就是每次对服务器的请求cookie都会附带上去增加了网络带宽

鉴于以上几点考虑,并且项目中希望以文件形式存储,不予考虑!

cookie存储操作示例:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

function setCookie() {

    var value = $(‘#data‘).val();

    if (value != ‘‘ && $.trim(value) != ‘‘) {

        var expireDate = new Date();

        expireDate.setTime(expireDate.getTime() + 30 * 24 * 3600 * 1000);

        document.cookie = "data=" + escape(value) + ("; expires=" + expireDate.toGMTString());

       

    } else {

        alert(‘请输入要存储的数据!‘);

    }

}

function getCookie() {

    if (document.cookie.length > 0) {

        var startIndex = 5;

        var endIndex = document.cookie.indexOf(";", 0);

        var data = "";

        if (endIndex != -1) {

            data = unescape(document.cookie.substring(startIndex, endIndex));

            

        } else {

            data = unescape(document.cookie.substring(startIndex, document.cookie.length));

        }

        $(‘#data-display‘).html(data);

    }

}

 2).localStorage

html5本地存储分为两种,一是key-value对的形式存储,一种是DateBase存储;

1.key-value本地存储有sessionStorage和localStorage两种

sessionStorage:会话存储,生命期从进入网站开始,从关闭网站后结束

localStorage:本地存储,即使关闭浏览器,再次打开时同样能够读取到存储的数据,这也是其与sessionStorage的区别

示例:


1

2

window.localStorage.setItem(‘name‘,‘istone‘);

window.localStorage.getItem(‘name‘);

  2.html5本地数据库,提供了一套API来操作


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

var db = openDatabase(‘mydb‘, ‘1.0‘, ‘Test DB‘, 2 * 1024 * 1024);

        var msg;

           

        db.transaction(function (tx) {

           tx.executeSql(‘CREATE TABLE IF NOT EXISTS LOGS (id unique, log)‘);

           tx.executeSql(‘INSERT INTO LOGS (id, log) VALUES (1, "foobar")‘);

           tx.executeSql(‘INSERT INTO LOGS (id, log) VALUES (2, "logmsg")‘);

           msg = ‘<p>Log message created and row inserted.</p>‘;

           document.querySelector(‘#status‘).innerHTML =  msg;

        });

        db.transaction(function (tx) {

           tx.executeSql(‘SELECT * FROM LOGS‘, [], function (tx, results) {

              var len = results.rows.length, i;

              msg = "<p>Found rows: " + len + "</p>";

              document.querySelector(‘#status‘).innerHTML +=  msg;

                   

              for (i = 0; i < len; i++){

                 msg = "<p><b>" + results.rows.item(i).log + "</b></p>";

                 document.querySelector(‘#status‘).innerHTML +=  msg;

              }

           }, null);

        });

  浏览器支持情况

3)h5File API

对于页面数据的保存,采用js库将数据json化,如:JSON.stringify(),IE的数据保存网上搜到是调用浏览器‘另存为‘的功能来保存成 txt,而对于chrome的数据保存调用html5的API接口blob封装数据提供给a标签的href,文件名提供给download

+

  对于本地文件的读取,采用html5 fileAPI:FileReader,通过readAsText方法读取到本地json串,JSON.parser()转回去.

时间: 2024-08-10 19:21:45

h5缓存之数据库的相关文章

H5缓存机制浅析-移动端Web加载性能优化【干货】

转载:H5缓存机制浅析-移动端Web加载性能优化[干货] 作者:贺辉超,腾讯游戏平台与社区产品部 高级工程师 目录 1 H5缓存机制介绍 2 H5缓存机制原理分析 2.1 浏览器缓存机制 2.2 Dom Storgage(Web Storage)存储机制 2.3 Web SQL Database存储机制 2.4 Application Cache(AppCache)机制 2.5 Indexed Database (IndexedDB) 2.6 File System API 3 移动端Web加载

H5 缓存机制浅析 移动端 Web 加载性能优化

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性.离线存储(也可称为缓存机制)是其中一个非常重要的特性.H5 引入的离线存储,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问. H5 应用程序缓存为应用带来三个优势: 离线浏览 用户可在应用离线时使用它们 速度 已缓存资源加载得更快 减少服务器负载 浏览器将只从服务器下载更新过或更改过的资源. 根据标准,到目前为止,H5 一共有6种缓存机制,有些是之前已有,有些是 H5 才新加入的. 浏览

缓存与数据库的一致性思考

时隔两年,重新启动这个博客.熟悉又有点陌生,这两年我的技术方向有了很大改变,但由于一直在使用为知笔记,因此这些改变没有提现在本博客上.之所以重启这个博客,主要是因为博客是一个开放的东西,可以带来一些交流,而笔记则是个人的东西,缺少思维碰撞.闲话少叙,这就开始. 问题:怎么保持缓存与数据库一致? 要解答这个问题,我们首先来看不一致的几种情况.我将不一致分为三种情况: 1. 数据库有数据,缓存没有数据: 2. 数据库有数据,缓存也有数据,数据不相等: 3. 数据库没有数据,缓存有数据. 在讨论这三种

缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cach

服务的扩展性(如何创建具有可扩展性的服务实例,缓存以及数据库)

转自:http://www.cnblogs.com/loveis715/p/5097475.html 在编写一个应用时,我们常常考虑的是该应用应该如何实现特定的业务逻辑.但是在逐渐发展出越来越多的用户后,这些应用常常会暴露出一系列问题,如不容易增大容量,容错性差等等.这常常会导致这些应用在市场的拓展过程中无法快速地响应用户的需求,并最终失去商业上的先机. 通常情况下,我们将应用所具有的用来避免这一系列问题的特征称为非功能性需求.相信您已经能够从字面意义上理解这个名词了:功能性需求用来提供对业务逻

缓存与数据库一致性保证(转)

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,"先淘汰缓存,再修改数据库"这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数

【58沈剑架构系列】缓存与数据库一致性保证

本文主要讨论这么几个问题: (1)啥时候数据库和缓存中的数据会不一致 (2)不一致优化思路 (3)如何保证数据库与缓存的一致性 一.需求缘起 上一篇<缓存架构设计细节二三事>(点击查看)引起了广泛的讨论,其中有一个结论:当数据发生变化时,“先淘汰缓存,再修改数据库”这个点是大家讨论的最多的. 上篇文章得出这个结论的依据是,由于操作缓存与操作数据库不是原子的,非常有可能出现执行失败. 假设先写数据库,再淘汰缓存:第一步写数据库操作成功,第二步淘汰缓存失败,则会出现DB中是新数据,Cache中是旧

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售

Spring Cloud微服务架构实现+Guava缓存+redis+数据库设计+微服务原理改造房产销售 一.分布式服务框架的发展 1.1 第一代服务框架 代表:Dubbo(Java).Orleans(.Net)等 特点:和语言绑定紧密 1.2 第二代服务框架 代表:Spring Cloud等 现状:适合混合式开发(例如借助Steeltoe OSS可以让ASP.Net Core与Spring Cloud集成),正值当年 1.3 第三代服务框架 代表:Service Mesh(服务网格) => 例如

Java进阶面试必问:如何保证缓存与数据库的双写一致性?

面试题 如何保证缓存与数据库的双写一致性? 面试官心理分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 "缓存+数据库" 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多