Java 是否有一个「;“嵌入式数据库管理系统”;在同一个db文件上支持多个writer应用程序(进程)?

Java 是否有一个「;“嵌入式数据库管理系统”;在同一个db文件上支持多个writer应用程序(进程)?,java,database,file,Java,Database,File,我需要知道是否有任何嵌入式DBMS(最好是Java,不一定是关系型的)支持同一组db文件上的多个编写器应用程序(进程)。我需要多个作者和多个读者 更新: 这不是一个多连接问题。我的意思是,我不需要多个连接到正在运行的DBMS应用程序(进程)来写入数据。我需要在同一个存储文件上提交多个DBMS应用程序(进程) HSQLDB、H2、JavaDB(Derby)和MongoDB不支持此功能 我认为可能存在一些文件系统限制,禁止这样做。如果是,是否有一个文件系统允许在一个文件上使用多个写入程序 用例:用例

我需要知道是否有任何嵌入式DBMS(最好是Java,不一定是关系型的)支持同一组db文件上的多个编写器应用程序(进程)。我需要多个作者和多个读者

更新:


这不是一个多连接问题。我的意思是,我不需要多个连接到正在运行的DBMS应用程序(进程)来写入数据。我需要在同一个存储文件上提交多个DBMS应用程序(进程)

HSQLDB、H2、JavaDB(Derby)和MongoDB不支持此功能

我认为可能存在一些文件系统限制,禁止这样做。如果是,是否有一个文件系统允许在一个文件上使用多个写入程序

用例:用例是一个高通量集群系统,它打算将其大容量的业务日志条目存储到存储器中。将业务日志存储在每个服务器的单独文件中并不合适,因为整个业务日志都需要查询和索引功能

因为,我想使用SAN网络带宽进行日志记录,而群集LAN带宽用于其他服务器到服务器和客户端到服务器的通信。

是一个功能齐全的数据库,支持多个连接和事务隔离级别
READ\u UNCOMMITTED
。如果这适合你,那就去做吧

有关运行数据库的方法,请参阅。

是,看起来是。

尝试(以前是Borland Interbase)。它有“超级服务器”和“经典”模式。前者是传统的多线程数据库服务器,而后者遵循经典的每个连接一个进程模型。不同的进程主要通过操作系统级的数据文件锁定来协调。据我所知,您实际上可以将经典服务器嵌入到您自己的代码中。然后,您的应用程序将只是一个更经典的过程


更新:没有阅读Java部分。在这种情况下,你最好选择其他答案

更新:当我说“锁定”时,我并不是说它同时锁定了整个数据库。即使在经典模式下,它仍然是一个成熟的RDBMS。然而,我对软件的了解还不够透彻,无法说出引擎盖下到底发生了什么

是Sun支持的开源ApacheDerby 100%Java技术数据库的发行版。它是完全事务性的、安全的、易于使用的、基于标准的—SQL、JDBCAPI和JavaEE—但很小,只有2.5MB

Java DB包含在JDK的Java SE中,是Sun GlassFish企业服务器的开发人员数据库

它可以在允许多个连接的模式下运行

更新:小错误,JavaDB不是我最初写的JavaSE的一部分,而是JDK的一部分


更新2:现在问题已经澄清,我的理解是OP实际上在寻找类似“共享存储数据库服务器”(可嵌入)的东西,我实际上不认为Java DB属于这一类。老实说,我想知道这是否存在。我知道一些数据库集群解决方案使用共享存储(,DB2),但我不理解这个问题是关于数据库集群的。此外,据我所知,这些解决方案是不可嵌入的。但我会更深入地挖掘这一点(并密切关注这个问题)。

更正:MongoDB直接或通过mongos支持multiwriter

除非你以某种方式改变你的要求,否则你基本上是运气不佳

首先,特别是在Unix系统上,没有什么可以阻止多个进程写入相同的文件。在单个系统上,这无论如何都不会成为问题,如果两个或多个写入操作在文件中的同一空间上发生冲突,那么您将遇到一个典型的争用条件,即实际写入的是哪一个。因为它在一个系统上,所以在字节级别上有完美的分辨率

因此,让多个进程写入同一个文件的游戏是如何协调这些进程?如何确保它们不会相互碰撞。同样,在Unix中,有一种基于操作系统的锁定机制可以用来防止这种情况发生,但通常大多数系统都会实现一个中央服务器来协调通过该系统进行的所有写入,然后它会写入磁盘,同时缓解和处理任何冲突

你的问题是双重的

第一,您的意思是独立的日志进程不会合作,它们不会共享信息并协调对卷的写入。这就给工厂带来了麻烦

其次,您建议不仅让多个进程写入同一卷,而且让它们写入的卷通过SAN共享。那又是一把扳手

与NFS不同,SAN不支持“文件系统”。相反,它们支持“存储”。基本上是块级设备。SAN,一旦你通过了一系列卷管理的恶作剧,从OSs的角度来看,实际上是相当“愚蠢”的

我很确定你可以在多台机器上安装一个卷,但我不确定不止一台可以向这个设备写入。这是有充分理由的

简单地说,SAN是块级存储。例如,一个4K字节的块。这是SAN的“原子”工作单元。要更改单个字节的数据吗?从SAN中读取4K块,更改字节,然后写回4K块

如果您有多台机器认为它们可以“通用”访问SAN存储,并将其视为文件系统,那么您的文件系统已损坏。就这么简单。这些机器会写出他们认为块应该是什么样子,而其他机器则会用本地版本将其粉碎。灾难。破坏不高兴

甚至让一台机器写入SAN,而另一台机器读取f ------------- ------------- ------------- | | | | | | | Process-1 | | Process-2 | ... | Process-N | | | | | | | ------------- ------------- ------------- | | | | | | V V V ( log-1 ) ( log-2 ) ... ( log-N ) \ \ / \ \ / - - - - \ | / - - - - \ | / \ | - \ | / ||| VVV ------------- | | | Process-X | | | ------------- | V V -------------- V | | ( log-X ) ------>>>| Log Reader | | | --------------
ChronicleMap<Key, Value> map = ChronicleMap
    .of(Key.class, Value.class)
    .entries(...)
    ...
    .createPersistedFile(sharedDbFile); // <- here