【问题标题】:Concurrency in embedded (in-proces) databases H2, Hsqldb, Apache Derby, SQLite (JDBC)嵌入式(进程内)数据库 H2、Hsqldb、Apache Derby、SQLite (JDBC) 中的并发性
【发布时间】:2015-08-11 06:14:09
【问题描述】:

是否可以在具有不同进程的同一台机器(无服务器)上同时(读/写)使用嵌入式数据库。一个多线程进程中的并发读/写呢?

我试图找出如何在 HSQL、H2、Apache Derby 和 SQLite(通过 xerial JDBC)中解决并发问题,但我不太了解那些锁定机制(MVCC、OCC 等),所以我需要有人来纠正我所拥有的找到了。

  1. H2:只有一个可能是多线程的进程可以连接到数据库。
    • 写入读取操作的表级锁定不需要锁定,并且可以与写入同时完成(N 个读取器一个写入器)
    • MVCC - 用于写入的表或行级别锁定(N 个读取器一个写入器??)
  2. Hsql:看起来和H2完全一样,但是在MVCC机制上有一些不同
  3. Apache Derby (JavaDB):只有一个可能是多线程的进程可以连接到数据库。
    • 用于写入的表级锁定或行级锁定。读取操作不需要锁定,可以与写入同时完成(N 个读取器一个写入器)
  4. SQLite (xerial JDBC):多个进程可以同时连接,但只有一个可以进行写入操作。 (数据库锁定)。
    • 当有写锁时其他进程或线程不能进行读写操作??

【问题讨论】:

    标签: sqlite concurrency hsqldb h2 javadb


    【解决方案1】:

    HSQLDB 在它支持的所有三种事务模型(MVCC、LOCKS 和 MVLOCKS,它是具有表级锁的 MVCC)中都支持完整的多线程操作。

    如果 HSQLDB 在没有服务器的情况下嵌入运行,根据定义,它是嵌入它的进程的一部分。该进程可以使用多个线程同时访问数据库(例如嵌入 HSQLDB 的 Web 服务器,例如 TOMEE)。在 embedded-with-no-database-server 部署中,没有其他进程可以看到数据库。

    在所有模式下,N 个写入器和 M 个读取器可以同时工作。 LOCKS 模式对表进行读写锁定,而 MVCC 模式只锁定已更新的行。

    也可以在嵌入 HSQLDB 的进程中运行服务器。这样的服务器允许与嵌入数据库的进程同时访问其他进程。

    【讨论】:

    • 非常感谢。当文档说它是完全多线程的时,这是否意味着我只选择事务模型(MVCC、LOCKS、MVLOCKS)和 DBMS 自动确保多线程应用程序不会损坏数据完整性(在嵌入式模式下)?其次,如果它是嵌入的(进程内),但数据可以保存在磁盘上,因此它对其他进程使用数据库文件锁定?
    • 是的,您选择 TX 模型,它可以确保数据完整性,是的,它可以防止第二个进程连接到数据库并损坏文件。
    【解决方案2】:

    还嵌入了 MySQL,通常认为它对于 WWW 典型的读取经常写入几乎从不的工作负载来说比面向 OLTP 的全面服务器更轻。

    https://github.com/vorburger/MariaDB4j

    我不知道这个项目或其他一些 Java 化是否好。

    【讨论】:

      【解决方案3】:

      Firebird 2.5 可能是单进程多线程方法的一个选项

      Is Firebird good embedded DB for ASP.NET? Which else?

      但您必须建立多个连接(每个线程一个)

      更新:在 Firebird 3 中,嵌入式(进程内)服务器(或多个,如果有多个使用嵌入式服务器 DLL/LIB.SO 的操作系统进程)和经典模式独立服务器(现在基本上是嵌入式 dll 的 OS 进程加载器)可以与同一个数据库文件同时工作。 SuperServer 模式的独立 FB3 虽然会锁定数据库文件以进行垄断访问。

      【讨论】:

      • 谢谢。 Firebird Embedded 是嵌入式服务器吧?所以应用程序连接到嵌入式数据库并启动另一个服务器进程或嵌入式服务器意味着服务器与应用程序在同一进程中运行?
      • Server 只是你加载到 JVM 中的一个库
      • 数据库通常是一个文件,放置在服务器(独立或嵌入到您的应用程序中 - 没有区别)运行的同一台计算机上(需要本地访问才能对访问它的其他进程进行独占锁定)。引擎是基于写时复制的,因此通常不会发生锁定;处理数据,但由于从另一个线程提交的更改数据,某些提交可能会被拒绝。人们相信,在典型的工作负载中,这种乐观的无锁方法导致的冲突比悲观的锁 - 一切都少
      猜你喜欢
      • 2015-10-19
      • 2011-09-24
      • 1970-01-01
      • 2017-03-05
      • 1970-01-01
      • 2021-10-11
      • 1970-01-01
      • 1970-01-01
      • 2020-09-18
      相关资源
      最近更新 更多