阅读更多

3顶
0踩

数据库
在我眼里,MySQL和Oracle是这样的






而SQLite在是这样的



所以这么萌的数据库,我真的应该多了解她的。

简介
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的设备内置的都是SQLite数据库。SQLite虽然娇小,但也支持事务和多数的SQL92标准。

主要特点
  • Zero-Configuration 无需安装和管理配置。
  • Serverless 无需服务器支持。
  • Single Database File 数据文件存储在一个单一的磁盘文件。
  • Stable Cross-Platform Database File 数据库文件格式跨平台,无论是大小端,或者是32bit或64bit机器都没有关系
  • Compact 完整特性的SQLite编译出来在500KiB左右,裁剪特性甚至可以得到低于300KiB的库(当前版本3.8.11.1)。
  • Manifest typing 可以声明数据库字段类型,但是字段存储的类型实际的存储类型和实际值相关,单独的一个字段可能包含不同存储类的值。
  • Variable-length records 可变长度记录,例如你存储一个字符到VARCHAR(100) 的列,实际需要的存储空间一个字符加一个字节的存储空间。
  • SQL statements compile into virtual machine code SQL语句会被编译成虚拟机代码,这种虚拟机代码直白可读,便于调试。
  • Public domain 完全开源。
  • SQL language extensions

主要缺点
  • SQLite 只提供数据库级的锁定,所以不支持高并发。
  • 不支持存储过程。
  • SQLite 没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。

如果只在移动设备使用SQLite,那么他的优点足够好,并且缺点不明显,所以大叔MySQL走开。SQLite妹妹快过来╭(╯3╰)╮。
事务与锁( < 3.7.0)
SQLite的事务和锁是很重要的概念。


SQLite有5个不同的锁状态
  • UNLOCKED(未加锁)
  • SHARED(共享)
  • RESERVED(保留)
  • PENDING(未决)
  • EXCLUSIVE(排它)

SQLite有一个加锁表,记录数据库连接的锁状态。每个数据库连接在同一时刻只能处于其中一个锁状态。每种状态(UNLOCKED)都有一种锁与之对应。


数据库连接最初处于UNLOCKED状态,在此状态下,连接还没有存取数据库。当连接到了一个数据库,甚至已经用BEGIN开始了一个事务时,连接都还处于UNLOCKED状态。为了能够从数据库中读取数据,连接必须必须进入SHARED状态,也就是说首先要获得一个SHARED锁。多个连接可以同时获得并保持共享锁,也就是说多个连接可以同时从同一个数据库中读数据,SQLite是支持并发读取数据的。


一个连接想要写数据库,它必须首先获得一个RESERVED锁。一个数据库上同时只能有一个RESERVED锁,保留锁可以与共享锁共存,RESERVED锁即不阻止其它拥有SHARED锁的连接继续读数据库,也不阻止其它连接获得新的SHARED锁。 一旦一个连接获得了RESERVED锁,它就可以将数据写入缓冲区,而不是实际地写到磁盘。 当连接想要提交修改(或事务)时,需要获得PENDING锁,之后连接就不能再获得新的SHARED锁了,但已经拥有SHARED锁的连接仍然可以继续正常读数据库。当所有其它SHARED锁都被释放时,拥有PENDING锁的连接就可以将其锁提升至EXCLUSIVE锁,此时就可以将以前对缓冲区所做的修改写到数据库文件。所以SQLite是不支持并发写的。

事务
SQLite有三种不同的事务
  • DEFERRED(推迟)
  • MMEDIATE(立即)
  • EXCLUSIVE(排它)

事务类型在BEGIN命令中指定:



DEFERRED
一个DEFERRED事务不获取任何锁(直到它需要锁的时候),BEGIN语句本身也不会做什么事情——它开始于UNLOCK状态。默认情况下就是这样的,如果仅仅用BEGIN开始一个事务,那么事务就是DEFERRED的,同时它不会获取任何锁;当对数据库进行第一次读操作时,它会获取SHARED锁;同样,当进行第一次写操作时,它会获取RESERVED锁。

MMEDIATE
由BEGIN开始的IMMEDIATE事务会尝试获取RESERVED锁。如果成功,BEGIN IMMEDIATE保证没有别的连接可以写数据库。但是,别的连接可以对数据库进行读操作;但是,RESERVED锁会阻止其它连接的BEGIN IMMEDIATE或者BEGIN EXCLUSIVE命令,当其它连接执行上述命令时,会返回SQLITE_BUSY错误。这时你就可以对数据库进行修改操作了,但是你还不能提交,当你COMMIT时,会返回SQLITE_BUSY错误,这意味着还有其它的读事务没有完成,得等它们执行完后才能提交事务。

EXCLUSIVE
EXCLUSIVE事务会试着获取对数据库的EXCLUSIVE锁。这与IMMEDIATE类似,但是一旦成功,EXCLUSIVE事务保证没有其它的连接,所以就可对数据库进行读写操作了。

死锁
如果两个以BEGIN DEFERRED开始事务的连接都处于SHARED状态,并且都在等待对方结束SHARED从而进入RESERVED的话,就会进入死锁状态。所以BEGIN DEFERRED开始的事务是有可能产生死锁的。

Write-Ahead Logging ( >=3.7.0 )
SQLite 3.7.0之前是不支持写的时候读得。为了能够读得时候写,引入了Write-Ahead Logging(WAL)机制,这样可以支持一个写和多个读并发。

在引入WAL机制之前,SQLite使用rollback journal机制实现原子事务。



rollback journal机制的原理是:在修改数据库文件中的数据之前,先将修改所在分页中的数据备份在另外一个地方,然后才将修改写入到数据库文件中;如果事务失败,则将备份数据拷贝回来,撤销修改;如果事务成功,则删除备份数据,提交修改。

WAL机制的原理是:修改并不直接写入到数据库文件中,而是写入到另外一个称为WAL的文件中;如果事务失败,WAL中的记录会被忽略,撤销修改;如果事务成功,它将在随后的某个时间被写回到数据库文件中,提交修改。

同步WAL文件和数据库文件的行为被称为checkpoint(检查点),它由SQLite自动执行,默认是在WAL文件积累到1000页修改的时候;当然,在适当的时候,也可以手动执行checkpoint,SQLite提供了相关的接口。执行checkpoint之后,WAL文件会被清空。

在读的时候,SQLite将在WAL文件中搜索,找到最后一个写入点,记住它,并忽略在此之后的写入点(这保证了读写和读读可以并行执行);随后,它确定所要读的数据所在页是否在WAL文件中,如果在,则读WAL文件中的数据,如果不在,则直接读数据库文件中的数据。

在写的时候,SQLite将之写入到WAL文件中即可,但是必须保证独占写入,因此写写之间不能并行执行。

WAL在实现的过程中,使用了共享内存技术,因此,所有的读写进程必须在同一个机器上,否则,无法保证数据一致性。

优点
  • 读和写可以完全地并发执行,不会互相阻塞(但是写之间仍然不能并发)。
  • WAL在大多数情况下,拥有更好的性能(因为无需每次写入时都要写两个文件)。
  • 磁盘I/O行为更容易被预测

缺点
  • 访问数据库的所有程序必须在同一主机上,且支持共享内存技术。
  • 每个数据库现在对应3个文件:.db,-wal,-shm。
  • 当写入数据达到GB级的时候,数据库性能将下降。
  • 3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。
  • WAL引入的兼容性问题。在启用了WAL之后,数据库文件格式的版本号由1升级到了2,因此,3.7.0之前的SQLite无法识别启用了WAL机制的数据库文件。禁用WAL会使数据库文件格式的版本号恢复到1,从而可以被SQLite 3.7.0之前的版本识别。
  • WAL引入的性能问题。在一般情况下,WAL会提高SQLite的事务性能;但是在某些极端情况下,却会导致SQLite事务性能的下降:1.在事务执行时间较长或者要修改的数据量达到GB级的时候,WAL文件会被占用,它会暂时阻止checkpoint的执行(checkpoint会清空WAL文件),这将导致WAL文件变得很大,增加寻址时间,最终导致读写性能的下降。
  • 2.当checkpoint执行的时候,会降低当时的读写性能,因此,WAL可能会导致周期性的性能下降


文章来自:空之境界
  • 大小: 12.7 KB
  • 大小: 14.6 KB
  • 大小: 62.4 KB
  • 大小: 6.6 KB
  • 大小: 6.3 KB
来自: 空之境界
3
0
评论 共 2 条 请登录后发表评论
2 楼 jpgtama 2015-08-25 21:49
引用
When To Use SQLite
  • Embedded applications:

  • All applications that need portability, that do not require expansion, e.g. single-user local applications, mobile applications or games.
  • Disk access replacement:
  • In many cases, applications that need to read/write files to disk directly can benefit from switching to SQLite for additional functionality and simplicity that comes from using the Structured Query Language (SQL).
  • Testing:
  • It is an overkill for a large portion of applications to use an additional process for testing the business-logic (i.e. the application's main purpose: functionality).



When Not To Use SQLite

  • Multi-user applications:
  • If you are working on an application whereby multiple clients need to access and use the same database, a fully-featured RDBM (e.g. MySQL) is probably better to choose over SQLite.
  • Applications requiring high write volumes:
  • One of the limitations of SQLite is the write operations. This DBMS allows only one single write*operating to take place at any given time, hence allowing a limited throughput.
1 楼 jpgtama 2015-08-25 21:33
I copied the history of SQLite from Wikipedia:


引用
D. Richard Hipp designed SQLite in the spring of 2000 while working for General Dynamics on contract with the United States Navy.[11] Hipp was designing software used aboard guided missile destroyers, which were originally based on HP-UX with an IBM Informix database back-end. The design goals of SQLite were to allow the program to be operated without installing a database management system or requiring a database administrator. Hipp based the syntax and semantics on PostgreSQL 6.5 documentation. In August 2000, version 1.0 of SQLite was released, with storage based on gdbm (GNU Database Manager). SQLite 2.0 replaced gdbm with a custom B-tree implementation, adding transaction capability. SQLite 3.0, partially funded by America Online, added internationalization, manifest typing, and other major improvements.
In 2011 Hipp announced his plans to add an UnQL interface to SQLite databases and to develop UnQLite, an embeddable document-oriented database.[12]

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • android sqlite回滾,SQLIte这么娇小可爱,不多了解点都不行啊

    在我眼里,MySQL和Oracle是这样的而SQLite在是这样的所以这么萌的数据库,我真的应该多了解她的。简介SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它的设计目标是嵌入式的,目前Android和iOS的...

  • nio

    如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。  这是在一个单线程中使用一个Selector处理3个Channel的图示:  要使用...

  • NIO

    如果你的应用打开了多个连接(通道),但每个连接的流量都很低,使用Selector就会很方便。例如,在一个聊天服务器中。 这是在一个单线程中使用一个Selector处理3个Channel的图示: 要使用...

  • ASP制作学生档案管理系统.docx

    ASP制作学生档案管理系统.docx

  • 工业风机永磁同步电机:低噪音、低温运行,高效带载能力,转矩脉动小,性能卓越的设计模型方案

    内容概要:本文详细介绍了应用于工业风机的永磁同步电机的独特设计模型及其优越性能。该电机具有低转矩脉动、低噪音、低温升和长时间带载运行等特点,适用于对电机稳定性要求较高的场所,如医院和实验室。文中不仅探讨了电机的具体参数(如功率550W、转速2800rpm、扭矩1.88Nm、电压220V),还展示了如何通过Python代码进行基本的电机控制,包括初始化和设置转速。此外,文章深入解析了电机内部设计细节,如磁极形状优化、电磁场仿真、温度补偿算法等,揭示了其高性能背后的技术秘密。 适合人群:从事工业自动化、电机设计与控制的研究人员和技术人员,以及对工业风机感兴趣的工程技术人员。 使用场景及目标:①优化现有工业风机系统的性能;②开发新型高效的工业风机;③理解和掌握永磁同步电机的设计原理和控制方法。 其他说明:文中提供的代码片段和设计思路有助于读者更好地理解和应用永磁同步电机技术,同时也强调了实际应用中的注意事项,如温度控制和转矩脉动补偿。

  • MATLAB滚动轴承故障诊断程序:EMD(经验模态分解)+样本熵特征提取法

    内容概要:本文详细介绍了利用MATLAB进行滚动轴承故障诊断的方法,重点在于采用经验模态分解(EMD)和样本熵相结合的方式提取故障特征。首先,通过对来自西储大学的标准轴承振动数据进行EMD分解,将复杂的振动信号分离成多个固有模态函数(IMF)分量。然后,针对每个IMF分量计算其样本熵值,以此作为特征向量的一部分。最终形成的特征向量可用于进一步的故障分类与识别。文中还讨论了一些实用技巧,如如何选择有效的IMF分量、优化样本熵计算效率等。 适合人群:机械工程领域的研究人员和技术人员,尤其是那些从事机械设备健康监测和故障诊断工作的专业人士。 使用场景及目标:适用于需要对滚动轴承进行精准故障诊断的应用场合,旨在提高故障检测的准确性并减少误判的可能性。通过这种方法,可以帮助维护团队及时发现潜在问题,预防意外停机,保障设备安全运行。 其他说明:作者提供了详细的MATLAB代码示例,便于读者理解和实践。此外,还指出了实践中可能会遇到的一些挑战及其解决方案,例如EMD的端点效应、样本熵对数据长度的敏感性等问题。

  • PDF转换工具xpdf-tools-win-4.05

    XPDF是一个开源的PDF查看、提取和转换工具套件,使用C++编写,支持多种操作系统,包括Linux、Unix、OS/2、Windows和Mac OS X‌1。XPDF不仅是一个PDF查看器,还包含多个实用工具,如文本提取器、图像转换器和HTML转换器等‌,内置工具包含pdftohtml、pdftotext、pdftopng、pdftops等,支持命令行调用,可实现自主开发程序的自动化。

  • Notepad++自用主题

    Notepad++自用主题

  • 昆仑通态:用485Modbus通讯控制三菱变频器,实现控制和参数设置,全面解析和应用

    内容概要:本文详细介绍了如何利用昆仑通态触摸屏通过RS485总线采用Modbus协议控制三菱变频器的方法。首先,文中讲解了硬件连接的具体步骤,包括正确的接线方法以及终端电阻的设置。接着,深入探讨了软件配置部分,如创建Modbus RTU父设备、设置通信参数(波特率、校验位等),并强调了三菱变频器地址偏移量的特殊处理。此外,提供了具体的编程实例,涵盖启动变频器、设置频率、读取运行状态等功能的实现。还提到了一些常见的调试技巧和注意事项,例如使用ModScan工具进行抓包验证、确保站号唯一性、正确处理浮点数等问题。最后,分享了一些高级应用场景,如通过配方存储快速切换生产参数,提高生产线灵活性。 适合人群:从事工业自动化领域的工程师和技术人员,特别是有志于掌握Modbus通讯协议及其在实际工程项目中应用的人士。 使用场景及目标:适用于需要集成昆仑通态触摸屏与三菱变频器进行远程控制和监测的小型到中型工业控制系统。主要目的是简化系统架构,降低成本,提升系统的可靠性和易用性。 其他说明:文中不仅提供了理论指导,还包括大量实战经验和代码片段,帮助读者更好地理解和实施相关技术。

  • CADASIL病临床探讨.docx

    CADASIL病临床探讨.docx

  • STM32 IAP固件升级程序源代码(串口环形队列接收模式实现固件升级程序)

    内容概要:本文详细介绍了STM32 IAP(In Application Programming)固件升级的具体实现方法,尤其强调了串口环形队列的应用。首先,文章阐述了IAP的整体流程,分为接收新固件、校验并写入Flash以及跳转到新程序执行三个主要阶段。接着,深入探讨了环形缓冲区的设计,包括头尾指针的volatile修饰、取模运算实现自动回卷、缓冲区满的判断逻辑等。此外,还讲解了Flash编程时需要注意的问题,如以半字为单位写入、内存对齐、擦除页面等。最后,讨论了跳转到新程序的关键步骤,如关闭中断、重置向量表、初始化堆栈指针等。文中还提到了一些实用技巧,如CRC校验、超时处理、状态机解析数据包等。 适合人群:具有一定嵌入式开发经验的工程师和技术爱好者。 使用场景及目标:适用于需要进行远程固件升级的STM32项目,旨在提高系统的灵活性和维护效率,减少物理接触设备的需求。 其他说明:本文提供了大量代码片段和实践经验,帮助读者更好地理解和应用IAP技术。

  • Motorcad外转子式永磁同步电机设计案例:高效能直流无刷电机技术揭秘,永磁电机特点分析

    内容概要:本文详细介绍了利用MotorCAD进行外转子式永磁同步电机设计的具体步骤和技术要点。针对一款55kW、220rpm、42极36槽的电机,文章深入探讨了散热设计、极槽配合选择、绕组设计、磁钢尺寸优化以及电磁方案验证等方面的内容。通过具体的参数设置和仿真测试,展示了如何提高电机的功率密度、效率和稳定性。同时,文中还分享了一些实用的经验和技巧,如通过调整极弧系数和采用特殊的绕组配置来减少齿槽转矩脉动,从而确保电机在低速大扭矩应用场景中的优异性能。 适合人群:从事电机设计、制造及相关领域的工程师和技术人员,尤其是对外转子式永磁同步电机感兴趣的读者。 使用场景及目标:适用于需要设计高性能、低速大扭矩电机的工程项目,旨在帮助工程师掌握高效的设计方法和优化策略,以应对实际应用中的挑战。 其他说明:文章不仅提供了详细的参数设置指导,还分享了许多实践经验,有助于读者更好地理解和应用相关技术。此外,文中提及的所有工程文件均已上传至GitHub,方便读者进一步研究和参考。

  • 基于虚拟电网磁链定向和电压定向控制的Simulink仿真图

    内容概要:本文详细介绍了基于Simulink仿真的虚拟电网磁链定向(VFOC)和电压定向控制(VOC)两种电力电子变换器控制策略。首先探讨了主电路拓扑及其核心模块如虚拟磁链观测器的设计,强调了积分器漂移问题及解决方案。接着深入讲解了坐标变换模块的具体实现,指出常见的相位错误及修正方法。随后讨论了电流环和电压环的PI参数整定技巧,分享了实际调试中的经验和优化方法。最后展示了仿真波形,比较了VFOC和VOC在不同条件下的性能表现。 适合人群:从事电力电子、自动化控制领域的工程师和技术人员,尤其是对Simulink仿真感兴趣的读者。 使用场景及目标:帮助读者理解和掌握VFOC和VOC的工作原理及实现方法,提高实际项目中的控制系统设计能力。具体应用场景包括但不限于新能源并网、电机驱动等领域。 其他说明:文中提供了大量实用的技术细节和调试经验,有助于读者在实践中避免常见错误,提升仿真实验的成功率。同时提醒读者关注硬件级细节如死区补偿等,以获得更好的控制效果。

  • 花卉数据集(Oxford-102 Flower—102 Category Flower Dataset).zip

    花卉数据集(Oxford-102 Flower—102 Category Flower Dataset).zip

  • 三菱PLC伺服XZ轴定位控制程序——成熟稳定、全面注释、经典案例,适合初学者借鉴参考

    内容概要:本文详细介绍了三菱FX3U系列PLC用于XZ轴伺服定位的程序设计及其应用实例。程序分为三个主要模块:轴参数初始化、原点回归和定位运动控制。文中提供了具体的梯形图代码示例,涵盖了加减速时间设置、绝对定位指令、原点回归逻辑、手动控制、自动运行、异常处理等方面的内容。此外,还分享了一些调试经验和实用技巧,如脉冲量计算、安全联锁设计以及扩展性和维护便利性的考虑。 适合人群:从事工业自动化领域的工程师和技术人员,尤其是对三菱PLC和伺服控制系统有一定了解的人。 使用场景及目标:适用于需要进行高精度XZ轴伺服定位控制的自动化设备开发和维护。目标是帮助读者掌握三菱FX3U系列PLC的编程方法,提高设备的稳定性和可靠性。 其他说明:文中提到的程序已在多个实际项目中得到验证,能够实现±0.0mm级别的定位精度。对于初学者来说,建议逐步调试各模块的功能,确保每个环节正常工作后再进行整体集成。

  • 2025年计算机二级无纸化选择题题库.doc

    2025年计算机二级无纸化选择题题库.doc

  • 电动汽车踏板测试机:Labview源码经典框架,研华硬件与数据分析的完美结合

    内容概要:本文详细介绍了电动汽车踏板测试机的开发过程和技术要点。主要围绕LabVIEW平台,结合研华PCI-1220U运动控制卡和PCI-1716L数据采集卡,以及西门子S7-1200 PLC的安全联锁,构建了一个高效稳定的测试系统。文中涵盖了运动控制、数据采集、PLC通信、包络控制算法、数据追溯等多个方面的具体实现细节和技术难点。特别是针对硬件同步、数据处理优化、异常检测等方面进行了深入探讨,并提供了实用的代码示例。 适合人群:从事工业自动化、嵌入式系统开发的技术人员,尤其是对LabVIEW有一定了解的研发人员。 使用场景及目标:适用于需要进行复杂机电一体化系统集成的场合,如汽车零部件测试、工业机器人控制等领域。目标是帮助工程师快速掌握多设备协同工作的关键技术,提高系统的可靠性和性能。 其他说明:文章不仅分享了具体的编程技巧,还强调了工程实践中常见的陷阱和应对策略,对于希望深入了解工业控制系统的读者非常有价值。

  • QPSK调制在瑞利与高斯信道下的误码率计算及星座图分析,与ASK、FSK、DPSK等调制方式的误码率对比研究

    内容概要:本文详细介绍了QPSK(四相移键控)调制方法及其在瑞利信道和高斯信道下的误码率(BER)性能分析。首先展示了QPSK星座图的绘制方法,接着构建了一个简化的QPSK发射机模型,用于将二进制比特流映射到相应的星座点。随后,分别实现了两种信道模型:高斯白噪声信道(AWGN)和瑞利信道,并探讨了它们对传输信号的影响。文中通过大量实验数据对比了这两种信道环境下QPSK系统的误码特性,揭示了瑞利信道由于存在多径效应而导致更高的误码率。此外,还讨论了与其他调制方式如BPSK、16QAM相比,QPSK在频谱效率方面的优势以及抗噪能力。 适合人群:从事无线通信领域的研究人员和技术爱好者,尤其是那些希望深入了解数字调制技术和信道建模的人士。 使用场景及目标:适用于教学演示、科研项目或个人学习,旨在帮助读者掌握QPSK调制的基本原理、信道传播特性及其对通信系统性能的影响。通过对不同信道条件下误码率的测量,使读者能够评估各种调制方案的选择依据。 其他说明:文中提供了详细的Python代码片段,便于读者动手实践并验证相关结论。同时提醒了一些常见的仿真陷阱,如信号能量归一化等问题,有助于提高仿真的准确性。

  • SVPWM过调制算法仿真

    内容概要:本文详细介绍了SVPWM(空间矢量脉宽调制)过调制算法的原理及其在MATLAB和Python环境下的仿真实现。首先解释了SVPWM的基本概念以及过调制的意义,即在调制比M>1时如何通过调整电压矢量组合来保持输出波形质量。接着给出了具体的算法步骤,包括矢量计算、扇区判断、矢量合成和脉宽计算,并提供了简化版的MATLAB代码示例。此外,还探讨了过调制带来的波形变化特点,如THD升高、波形削顶等,并提出了优化建议,如渐变因子的应用。最后,通过Python代码进一步展示了过调制的不同处理阶段,强调了实际应用中的注意事项。 适用人群:对电力电子、电机控制感兴趣的初学者和技术爱好者,特别是希望深入了解SVPWM过调制算法原理并进行仿真的研究人员。 使用场景及目标:适用于想要理解和研究SVPWM过调制算法的工作机制,以及希望通过仿真工具(如MATLAB、Python)验证算法效果的研究人员。目标是提高对过调制条件下SVPWM算法的认识,掌握其具体实现方法,并能够应用于实际工程项目中。 其他说明:文中不仅有详细的理论讲解,还有丰富的代码实例,帮助读者更好地理解SVPWM过调制算法的实际应用。同时提醒读者关注过调制带来的谐波失真等问题,并提供了一些解决方案。

Global site tag (gtag.js) - Google Analytics