Home  >  Article  >  Database  >  使用SQLite的感想

使用SQLite的感想

WBOY
WBOYOriginal
2016-06-07 14:59:041029browse

使用SQLite的感想 最近都在使用SQLite数据库,老实说这才是我使用的第三款数据库而已。使用它原因就应为它够轻量,而且性能挺不错。但使用久了也发现了一些问题。偶尔也会有怨言,但也不会骂SQLite是个破东西之类的,原因又几个:对SQLite的了解不过透彻,使

使用SQLite的感想

 

 最近都在使用SQLite数据库,老实说这才是我使用的第三款数据库而已。使用它原因就应为它够轻量,而且性能挺不错。但使用久了也发现了一些问题。偶尔也会有怨言,但也不会骂SQLite是个破东西之类的,原因又几个:对SQLite的了解不过透彻,使用方式上总有些不妥;自己的资历尚浅,解决问题的能力有限;自己也没本事写出比SQLite更好的数据库。

 

  在网上看了一下SQLite的适用场景。100000次/天访问量的网站,嵌入式设备和应用软件,应用程序文件格式等。但是读数据可时也会抛锁表的异常,SQLite的锁是粗粒度,这个对异常的处理不知如何是好;还有的就是数据库的损坏。Database disk image is malformed。网上说数据库造成数据库损坏的原因有三个

 

sqlite数据库在写入时断电等,导致数据库里的结果被破坏。

sqlite数据库所存的磁盘空间不够。

磁盘有坏磁道等

  之前数据库的损坏估计是第一种原因。而当时又没有对数据进行什么备份。只能人工用.dump命令从损坏的数据库中把数据导出来。这个顺带也讲一下吧

 

在SQLite的命令模式中打开数据库,依次输入一下命令

 

sqlite> .mode insert

sqlite> .output test.sql

sqlite> .dump

sqlite> .exit  

 

当然不一定要”.exit”命令,按“Ctrl+C”或直接关掉都行,导出的文件名“test.sql”随个人喜好。

 

或者用这个命令更好

 

sqlite3.exe dbname.db .dump>fileName.sql

 

这个命令导出的SQL会比上面那个要工整。

 

无论哪一种导出的SQL,如果数据库有问题的,导出的SQL里面会有这行

 

/**** ERROR: (11) database disk image is malformed *****/

 

最后也只能回滚事务RollBack。

 

要是想用回这些数据的话,把回滚事务改掉,把那句ERROR的删掉。

 

然后就是导入数据

 

sqlite3.exe newDBName.db

sqlite> .read test.sql

sqlite> .exit

 

  今后就打算对SQLite定期进行备份,备份的方式也只是单纯的文件IO操作——Copy一份呗。在读写数据库时万一抛出Database disk image is malformed异常时就认为数据库已经损坏了,马上换上备份的数据库。

 

  还有在写数据库的时候,在对数据库里多条记录进行操作的时候,对多个表的数据操作的时候用事务包起来,那么在写入数据库的时候,在数据库文件相同的目录下会产生一个文件名格式为: 数据库文件名 + "-journal"的文件。该文件在事物提交或回滚后将被立刻删除,不过听说在Android下,这个文件没被删除,只是以一个0B大小的文件存在。在事物运行期间,如果当前主机因电源故障而宕机,而此时由于回滚日志文件已经保存在磁盘上,那么当下一次程序启动时,SQLite在打开数据库文件的过程中将会发现该临时文件的存在,SQLite会在成功打开数据库之前先基于该文件完成数据库的恢复工作,以保证数据库的数据回复到上一个事物开始之前的状态。这样虽然不能避免数据库的损坏,但是能保证数据状态的一致性。

 

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn