我需要知道是否有任何嵌入式 DBMS(最好在 Java 中,不一定是关系型)支持同一组 db 文件上的多个编写器应用程序(进程)。 BerkeleyDB supports multiple readers but just one writer.我需要多个作者和多个读者。
更新:
这不是多连接问题。我的意思是我不需要多个连接到正在运行的 DBMS 应用程序(进程)来写入数据。我需要多个 DBMS 应用程序(进程)来提交相同的存储文件。
HSQLDB、H2、JavaDB (Derby) 和 MongoDB 不支持此功能。
我认为可能有一些文件系统限制禁止这样做。如果是这样,是否有一个文件系统允许在一个文件上有多个作者?
用例:用例是一个高吞吐量的集群系统,打算将其高容量的业务日志条目存储到 SAN 中。贮存。将业务日志存储在每个服务器的单独文件中是不合适的,因为整个业务日志都需要查询和索引功能。
因为 "a SAN typically is its own network of storage devices that are generally not accessible through the regular network by regular devices" ,我想使用 SAN 网络带宽进行日志记录,而集群 LAN 带宽用于其他服务器到服务器和客户端到服务器的通信。
最佳答案
你基本上不走运,除非你以某种方式改变你的要求。
首先,特别是在 Unix 系统上,没有什么可以阻止多个进程写入相同的文件。在单个系统上,这不会有任何问题,如果两个或多个写入在文件中的相同空间上发生冲突,您只会遇到典型的竞争条件,而实际上哪个空间将被写入。由于它在单个系统上,因此在字节级别具有完美的分辨率。
那么,在多个进程写入同一个文件方面的游戏是这些进程如何协调?如何确保他们不会互相踩踏。同样,在 Unix 中,有一个基于操作系统的锁定机制可用于防止这种情况发生,但通常大多数系统都实现了一个中央服务器,并通过该系统协调所有写入,然后写入磁盘,同时减轻和处理任何冲突。
你的问题是双重的。
一,您建议独立的日志进程不会合作,它们不会共享信息并协调它们对卷的写入。这将一个 Spanner (一个大 Spanner )投入到那里的工作中。
其次,您建议不仅让多个进程写入同一个卷,而且它们正在写入的卷通过 SAN 共享。那是另一个 Spanner 。
与 NFS 不同,SAN 不支持“文件系统”。相反,它们支持“存储”。基本上是块级设备。 SAN,一旦您通过了一堆卷管理恶作剧,从操作系统的角度来看,它实际上是非常“愚蠢的”。
我很确定您实际上可以在多台机器上安装一个卷,但我不确定实际上可以写入设备的不止一个。这有充分的理由。
简单地说,SAN 是块级存储。例如,一个块是 4K 字节。这是 SAN 的“原子”工作单元。想要更改单个字节的数据?从 SAN 读取 4K 块,更改字节,然后将 4k 块写回。
如果您有几台机器认为它们具有对 SAN 存储的“通用”访问权限,并且将其视为文件系统,那么您的文件系统已损坏。就这么简单。机器会写出他们认为的块应该是什么样子,而其他机器会用他们的本地版本来粉碎它。灾难。废墟。不开心。
即使让一台机器写入 SAN 而另一台机器读取它也很棘手。它也很慢,因为读取器几乎不能对磁盘的内容做出任何假设,因此它需要读取和重新读取块(它不能缓存任何内容,例如文件系统 TOC 等,因为它们是)由于作者的 Activity 而重新改变它的背后 - 所以,再读一遍......一遍又一遍......)。
NFS 之类的东西“解决”了这个问题,因为您不再使用原始存储。相反,您使用实际的文件系统。
最后,从服务器中流出独立的日志文件并没有错。他们仍然可以被查询。您只需重复查询并合并结果。
如果您有 5 台机器流式传输,并且您想要“下午 12:00 到 12:05 之间的所有 Activity ”,那么进行 5 次查询,每个日志存储一个,并合并结果。至于如何高效地查询日志数据,这是一个索引问题,并不是无法克服,取决于你如何查询。如果按时间查询,则按时间(每分钟、每小时等)创建文件,然后扫描它们。如果您的系统“很少读取”,这没什么大不了的。如果您需要更复杂的索引,那么您需要想出其他办法。
您可以使用数据库来写入文件和索引,但我怀疑您会发现很多人喜欢从他们无法控制的文件中读取数据,或者在文件下进行更改。
CouchDB 可能会起作用,或者类似的东西,因为它具有特定的抗崩溃性,始终一致的数据库格式。它的数据文件始终可由数据库实例读取。那可能是你的一个选择。
但我仍然会做多个查询并合并它们。
关于java - 是否有 "embedded DBMS"来支持同一数据库文件上的多个编写器应用程序(进程)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2082625/
我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看rubyzip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta