zoukankan      html  css  js  c++  java
  • FIREDAC操作SQLITE内存数据库

    SQLite不仅可以把数据库放在硬盘上,还可以放在内存中,经测试,同样条件下数据库放在内存中比放在硬盘上插入记录速度快差不多3倍。

    但数据库放在内存中时有如下缺陷:

    1、断电或程序崩溃后数据库就会消失,你需要定期Attach到硬盘上备份;

    2、在内存中的数据库不能被别的进程访问(因为没名字,以后可能支持),即使在多线程下,也得使用同一句柄;

    3、不支持像在硬盘上的读写互斥处理,需要自己加锁。

    4、只能本进程使用,其它进程无法使用。

    1)FIREDAC创建和使用参数打开一个SQLite内存数据库:
    //  建立一个内存数据库,存放当前登录信息
    FDConnection1.Params.Add('DriverID=SQLite');
    FDConnection1.Params.Add('Database=:memory:');
    FDConnection1.Open;
    FDConnection1.ExecSQL('CREATE TABLE Log(Id integer PRIMARY KEY)');
    // 执行insert语句
    FDConnection1.ExecSQL('INSERT INTO Log (1)');

    2)使用TFDSQLiteBackup将文件数据库转变为内存数据库。示例代码:
    FDConnection1.DriverName := 'SQLite';
    FDConnection1.Open;
    FDSQLiteBackup1.Database := '\srvdbdata.sdb';
    FDSQLiteBackup1.DestDatabaseObj := FDConnection1.CliObj;
    FDSQLiteBackup1.DestMode := smCreate;
    FDSQLiteBackup1.Backup;

    3)ATTACH(附加数据库)例如:
    FDConnection1.ExecSQL('ATTACH ''c:hr.sdb'' AS hr');
    FDConnection1.ExecSQL('ATTACH ''c:cust.sdb'' AS cust');
    FDQuery1.Open('select * from 'Orders' o ' +
    'left join hr.'Employees' e on o.EmployeeID = e.EmployeeID ' +
    'left join cust.'Customers' c on o.CustomerID = c.CustomerID');
    注意,firedac把数据库名作为目录名称理解。

    4)将SQLITE内存数据同步到文件数据库中。

    实现思路如下:

    1、创建文件数据库;

    2、创建内存数据库(文件数据库、内存数据库的内幕表结构需要一致);

    3、在内存数据库中attach文件数据库,这样可以保证文件数据库中的内容在内存数据库中可见;

    4、对于insert、select、delete、update操作,在内存数据库中操作;

    5、定时将内存数据库中的内容同步到文件数据库。

  • 相关阅读:
    Sharepoint COMException 0x81020037
    [SharePoint]如何去掉欢迎导航的信息?
    配置两台Azure服务器,一台加入另一台的ad域加入不进去的问题
    在Azure上部署Sqlserver网络访问不了的问题
    Page 由于代码已经过优化或者本机框架位于调用堆栈之上
    ProjectOnline同步数据到线下
    关于ProjectServer定制化项目中心页面
    oracle数据库逐步学习总结【基础二】
    Java学习个人总结
    oracle数据库逐步学习总结【基础一】
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/6089252.html
Copyright © 2011-2022 走看看