返回顶部
首页 > 资讯 > 数据库 >高频访问SQLite数据库
  • 720
分享到

高频访问SQLite数据库

高频访问SQLite数据库 2016-09-25 16:09:17 720人浏览 才女
摘要

使其多读多写的并发访问成为可能 sqlite 是一款开源的 SQL 数据库引擎,由于其自包含、无服务、零配置和友好的使用许可(完全免费)等特点,在桌面和移动平台被广泛使用。 在应用开发过程中,如果想保存点数据,

高频访问SQLite数据库

使其多读多写的并发访问成为可能

sqlite 是一款开源的 SQL 数据库引擎,由于其自包含、无服务、零配置和友好的使用许可(完全免费)等特点,在桌面和移动平台被广泛使用。

在应用开发过程中,如果想保存点数据,自然而然地就会想到 SQLite,毕竟它拥有非常多的实践者。这里分享一个在项目开发过程中遇到的 SQLite 读写问题——在开发一个小型桌面应用系统时,需求是跟踪文件系统中的变更,同时对变更文件进行相关操作,我们毫不犹豫地采用了 SQLite 来存储文件变更信息。

在开发过程中,SQLite 的数据读写都非常顺利,没有什么障碍。然而,当业务逻辑一切就绪开始跑业务时,我们发现软件处理业务的性能很差,每秒钟只能处理 10 个左右的业务量,比数据放在内存的老系统还慢得多。老系统也还可以达到每秒三十几个业务,而现在只有三分之一的水平。在有几千几万个文件变更事件同时涌入的情况下,系统几近停滞,会出现几秒钟一个业务的荒凉场景。这是不能容忍的事情。

经过技术排查,我们发现对 SQLite 的读和写都非常慢,最差的情况是从数据库中获取一条记录要花掉 7 秒钟,十分离谱。于是我们收罗学习了各种 SQLite 的优化技术并应用到了系统之中:

  • SQL 操作时采用事务机制
sqlite3_exec(db,"BEGIN TRANSACTioN;",0,0,0);
...
sqlite3_exec(db,"END TRANSACTION;",0,0,0);
  • 批量操作时,使用sqlite3_prepare而不是sqlite3_exec
sqlite3_prepare_v2(db, zSQL, -1,&stmt, &pzTail);
sqlite3_step(stmt);
...
  • 关闭数据库的磁盘同步写,降低数据安全
sqlite3_exec(db,"PRAGMA synchronous = OFF; ",0,0,0); 

常见的优化技术都已使用,效果有但不太理想,还是没有达到老系统的性能,更不要说超过了。

这里需要回顾一下我们的应用模型。业务有并发处理的要求,系统中使用了多线程机制,这就出现了对 SQLite 并发多读多写的情况。我们查阅 SQLite 的官方文档,多写者的情况是不适用的。

https://www.sqlite.org/whentouse.html


至此,是不是说解决的出路就只有使用 client/server 这样的数据库了?小应用拖一个巨无霸数据库,有种头重脚轻的感觉。

记得数据库课程的学习中,有提到大型数据库访问的 多层模型(N-tier),目的就是更高效地处理数据。那我们的文件型数据库有没有可能拥有 N-tier 的思想?尽管与大型数据库的方法不一样,但目的是一致的。我们分析一下现有应用对 SQLite 的读写情况,先看图:

pic

  • 操作1
    收到文件系统中的变更信息,并写入到数据库。由于文件变更信息是逐条发生的,无法预估事件的开始和结束,来一条写一条的方式,导致开启SQLite的事务模式也没有啥效果。

  • 操作2
    读取一条记录并进行业务操作,这里的读取并非只读,需要将该条记录标记为已选取,防止被其他业务处理线程读取而引发重复处理。因此,这一步也存在写操作。这里是读一条处理一条。

  • 操作3
    业务处理完毕后,从数据库中删除。这里也是逐条删除。

回顾应用的业务操作方式后发现,这些操作都是写操作,而且还是逐条进行的。问题摆在这里,技术问题还是需要通过技术来解决。在优化的过程中,我们是分步骤进行的——

  • 优化操作1
    采用延迟写的机制,收到文件变更信息后,不立即写入数据库,先放入缓存队列,等到达一定时间后再进行批量写入,这样在大量事件涌入时效果明显,大大减少了数据库的写操作次数。

  • 优化操作2
    使用缓存;好不容易准备好数据库查询语句,只检索了一条,太浪费时机,将符合检索要求的记录缓存起来。同时将记录被选取的标记放在内存中而不写数据库,这样对数据库来说仅是读操作。

  • 优化操作3
    同样采用延迟写,将收到的删除信息缓存起来,当累积到一定量或者时间后,再进行批量操作。这样就可以充分利用 SQLite 的事务功能,大大提升写操作的效率。


增加了这些数据库访问层后,数据库的读写性能提升明显,业务处理能力也达到了预期,超过了旧系统,主要的优化工作差不多就到此结束了。这里引入了延迟写和缓存机制,增加了程序的复杂度,带来的新挑战是如何保持缓存记录同数据库记录的一致性。为解决这个问题,使用了SQLite的自定义函数:

sqlite3_create_function(...);

通过创建自定义函数,来同步缓存记录和数据库记录。比如:在从数据库读取业务记录时,需要排除已经被标为"删除"的记录。

经历这个项目,我们让 SQLite 多读多写的并发访问也成为了可能,算是一个收获。(徐品华 | 天存信息)

您可能感兴趣的文档:

--结束END--

本文标题: 高频访问SQLite数据库

本文链接: https://www.lsjlt.com/news/8472.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 高频访问SQLite数据库
    使其多读多写的并发访问成为可能 SQLite 是一款开源的 SQL 数据库引擎,由于其自包含、无服务、零配置和友好的使用许可(完全免费)等特点,在桌面和移动平台被广泛使用。 在应用开发过程中,如果想保存点数据,...
    99+
    2016-09-25
    高频访问SQLite数据库
  • 如何实现SQLite数据库访问与生成
    这篇文章将为大家详细讲解有关如何实现SQLite数据库访问与生成,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Xamarin数据库访问方式本节我们将讲解数据库的方式方式以及数据库的生成方法。访问方式Xam...
    99+
    2023-06-03
  • oracle数据库访问
    1: 装上ODBC-oracle驱动之后,配置数据源的时候,用给的用户名和密码,弹出错:unable to connect SQLState=28000[oracle][ODBC][Ora]ORA-0101...
    99+
    2024-04-02
  • 深入剖析数据库连接池,让数据库访问更高效!
    数据库连接池概述 数据库连接池本质上是一个预先建立并维护的数据库连接集合。当应用程序需要访问数据库时,它可以从连接池中获取一个可用的连接。使用完连接后,该连接将被归还到连接池中,以便其他请求重用。 工作原理 连接池的运作过程如下: 初...
    99+
    2024-03-03
    数据库连接池 连接管理 JDBC C3P0 HikariCP
  • Spring JDBC 访问数据库
        Spring JDBC是Spring所提供的持久层技术,它以一种更直接、更简单的方式使用JDBC API。在Spring JDBC里,用户仅需要做那些必不可杀...
    99+
    2024-04-02
  • Android数据库之Sqlite
      sqllie区别于我们以前接触的数据库,它是通过android自带的 方法来驱动数据库的建立:   建立数据库表和操作数据库的大致过程:   1.让一个类 去继承 ...
    99+
    2022-06-06
    android数据库 SQLite Android
  • 驾驭数据库连接池:实现高效、可靠的数据库访问
    数据库连接池的优点 减少开销:创建和销毁数据库连接是非常耗时的。连接池通过重用现有连接,消除这种开销,从而提高性能。 可伸缩性:连接池可以根据应用程序的需求自动调整连接数量,从而实现可伸缩性。 可靠性:连接池可以检测并替换故障连接,确保...
    99+
    2024-04-02
  • java换成ip访问数据库无法访问
    一.错误现象 1.1 问题描述 springboot使用双数据源:本意是从第一个数据库中查询导数据然后加入另外一个数据库,代码一切正常后运行结果如下报错, 仔细一排查发现数据是查询到的,说明是入数据的库出问题了,结果发现我之前连接的时候是用...
    99+
    2021-09-19
    java换成ip访问数据库无法访问 数据库入门 数据库基础教程 数据库 mysql
  • 怎么访问vps数据库
    要访问VPS数据库,您需要使用一个数据库管理工具,如MySQL Workbench或phpMyAdmin。以下是一些基本步骤:1. ...
    99+
    2023-08-20
    vps 数据库
  • MySQL数据库索引为什么能提高数据访问性能
    这篇文章主要讲解了“MySQL数据库索引为什么能提高数据访问性能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL数据库索引为什么能提高数据访问性能”...
    99+
    2024-04-02
  • 定义数据模型&访问数据库
    定义数据模型一、Django定义数据模型在App中的models.py文件,数据库的表名称以类的形式来定义:[root@133 web]# cd /opt/python/dja...
    99+
    2024-04-02
  • 高并发数据库访问: Golang上的Go WaitGroup技术
    Go语言中的WaitGroup是一种用于等待一组goroutine完成执行的机制。在高并发数据库访问中,可以使用WaitGroup来...
    99+
    2023-10-20
    Golang
  • Android SQLite数据库存储
    前言:       Android为了让我们更加方便的管理数据库,专门提供了SQLiteOpenHelper帮助类,借助这个类可以简单的对数据库...
    99+
    2022-06-06
    存储 sqlite数据库 SQLite Android
  • android SQLite数据库总结
    SQLite SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌...
    99+
    2022-06-06
    sqlite数据库 SQLite Android
  • (数据库)SQLite的使用
        数据库的应用相当广泛,可以应用在Java、Android、IOS、Windows等所有主要的操作系统上SQLite虽然是轻量级的小引擎,但是能够支持高达2TB...
    99+
    2024-04-02
  • java 链接 sqlite数据库
    本次采用的sqlite的包是sqlite-jdbc-3.6.0.jarpackage com.***.app.mappcore.impl.util;import java.io.File;import ja...
    99+
    2024-04-02
  • sqlite数据库如何修改数据
    要修改SQLite数据库中的数据,可以使用UPDATE语句。以下是一个示例: UPDATE table_name SET colum...
    99+
    2024-04-10
    sqlite
  • 外网如何访问数据库
    小编给大家分享一下外网如何访问数据库,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 外网访问数据库的...
    99+
    2024-04-02
  • php怎么访问mysql数据库
    PHP可以通过使用MySQLi(MySQL improved extension)或PDO(PHP Data Objects)来访问...
    99+
    2023-09-26
    php mysql数据库
  • 使用 SpringBoot 访问 MySQL 数据库
    一、目标 创建一个 MySQL 数据库,构建一个 Spring 应用程序,并将其连接到新创建的数据库。 二、准备工作 最喜欢的文本编辑器或 IDE Java 17或更高版本 Gradle 7.5+或Maven 3.5+ 三、初始化项目 导...
    99+
    2023-08-17
    数据库 mysql spring boot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作