(使用 Delphi 2010 + WAL 模式的最新 SQLite)
我在我的多线程客户端应用程序中使用 DISQLite(SQLite 的 Delphi 端口)(尚未发布,所以如果我真的 必须)
我的分析器清楚地表明这是一个愚蠢的决定,我追踪到 2-3 个非常简单的 SQL 语句,这些语句在单线程应用程序中执行时运行良好,但因为线程锁定/等待(SQLite 确实不能很好地执行多个线程试图同时写入)
我尽最大努力优化我的代码/避免瓶颈,但经过几周的努力,我现在想知道是否更容易转储 SQLite 并选择不同的数据库引擎(?)
我的要求是:
我只对索引使用基本的 INSERT/UPDATE/DELETE 命令,没什么特别的。所以我的 SQL 要求相对基本(我不需要连接或其他“更高级”的 SQL 东西)。
我也对 NQL 解决方案持开放态度,只要它支持上述要求即可。
我的研究导致了 Berkley DB,如果我理解正确的话,它是支持并发写入的 SQLite 的修改版本,但问题是它不适用于 Delphi。
我也读过有关 Kyoto Cabinet 的资料,但话又说回来,没有 delphi 支持 :(
任何建议都非常受欢迎,
谢谢!
最佳答案
如果满足以下条件,您的申请速度是多少:
那你可以试试我们的Sqlite3 static binding这是在没有线程互斥锁的情况下编译的:
#define SQLITE_THREADSAFE 2
// assuming multi-thread safety is made by caller - in our framework, there is
// only one thread using the database connection at the same time, but there could
// be multiple database connection at the same time (previous was 0 could be unsafe)
#define SQLITE_OMIT_SHARED_CACHE 1
// no need of shared cache in a threadsafe calling model
我们在我们的 mORMot ORM 框架中使用了这样的模型,并且关联了四级缓存:
最终的性能一点也不差——它在多线程访问中扩展得很好,即使是全局临界区。当然,SQlite3 的设计并不像 Oracle 那样可扩展!但我在实际应用程序中使用过 SQlite,有很多客户端。您可以考虑使用 FireBird,它具有更复杂(和调整)的客户端-服务器架构。
关于写的更快,可以把写的东西分组到一个事务中,这样会快很多。我用的就是这个for speed-up writing并且您可以将此概念扩展到多个客户端:在服务器端,您将写入重新组合到一个共享事务中,该事务将在超时期限(例如一秒)后提交。
SQLite3 对于这样的添加非常快(使用带有绑定(bind)参数的准备好的 INSERT 语句甚至更快),但是对于单独的添加来说速度很慢,因为它必须使用低级 API 锁定整个文件,这太慢了。为了使其成为 ACID,请确保始终处理提交。事实上,其他数据库引擎通过隐藏在后台的类似过程实现了良好的并发速度。 SQLite3 的默认写法应该是这样的,以确保从多个进程访问同一个文件——但在您的客户端-服务器应用程序中,您可以只依赖于这样一个事实,即您将是唯一一个访问该文件的人SQLite3 数据库文件,所以它会很安全。
关于database - 具有并发写入功能的 SQLite 替代方案(Delphi),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9264772/
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您
我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#
我想知道Ruby用来在命令行打印这些东西的输出流:irb(main):001:0>a="test"=>"test"irb(main):002:0>putsatest=>nilirb(main):003:0>a=>"test"$stdout是否用于irb(main):002:0>和irb(main):003:0>?而且,在这两次调用之间,$stdout的值是否有任何变化?另外,有人能告诉我打印/写入这些内容的Ruby源代码吗? 最佳答案 是的。而且很容易向自己测试/证明。在命令行试试这个:ruby-e'puts"foo"'>test.
我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我