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、定时将内存数据库中的内容同步到文件数据库。

  • 相关阅读:
    10. Regular Expression Matching
    9. Palindrome Number (考虑负数的情况)
    8. String to Integer (整数的溢出)
    7. Reverse Integer (整数的溢出)
    LeetCode Minimum Size Subarray Sum
    LeetCode Course Schedule II
    Linux 文件缓存 (一)
    LeetCode Tries Prefix Tree
    Linux : lsof 命令
    LeetCode Binary Tree Right Side View
  • 原文地址:https://www.cnblogs.com/hnxxcxg/p/6089252.html
Copyright © 2011-2022 走看看