嵌入式(进程中)数据库中的并发H2,Hsqldb,Apache Derby,SQLite(JDBC)

时间:2015-05-28 15:58:15

标签: sqlite concurrency hsqldb h2 javadb

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

Iam试图找出如何在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):多个进程可以同时连接,但只有一个进程可以进行写操作。 (数据库锁定)。
    • 当有写入锁定时,其他进程或线程无法执行读写操作?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

还有嵌入式MySQL,通常它被认为对于读取行为更轻 - 通常写入几乎从不为WWW的工作负载而不是全面的OLTP目标服务器。

https://github.com/vorburger/MariaDB4j

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

答案 2 :(得分:0)

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

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

但你必须建立几个连接(每个线程一个)

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