- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经通过 hibernate 为我的应用程序使用 h2 (1.3.172) 一段时间了,在解决了一些非 h2 性能问题之后,我的性能瓶颈是 h2。我的数据库非常简单,有 10 个表,每个表的记录量不到 100,000 条记录,在 h2 功能范围内也是如此,但我认为问题出在多线程上。
我实际上是在使用 hibernate/h2 来控制我的应用程序中的内存消耗。我的应用程序使用管道方法处理文件,对可以处理的文件数量没有限制,因此如果我将数据存储在内存中,我会很快遇到 OutOfMemory。每个文件通常经过十个处理阶段,每个阶段都有自己的执行器服务,当文件从一个阶段移动到另一个阶段时,它会作为相关执行器服务上的作业添加。内存中存储的数据很少,而是在执行程序上启 Action 业时从数据库中检索有关文件的数据,并在作业完成时将数据写回数据库。我们有 10 个执行器,每个执行器都有机器内核大小的线程池,所以在 4 个机器内核上,理论上我们可以随时向数据库发出 40 个请求,但通常情况下我们只有不到 10 个。所以我们有许多事务正在进行主要同时涉及少量行。
我的应用程序是多线程的,如果我对其运行分析器,我会发现大部分时间我的线程处于阻塞状态,等待 executeQuery() 或 executeUpdate()。我读到 h2 是单线程的,所以我认为问题是由 h2 同步请求引起的,而不是锁定,但我可能误解了这一点。我已经设置了 MVCC=TRUE 以便 h2 进行行锁定而不是表锁定,但我仍然会遇到偶尔的超时 - 是否可以设置一些东西来检查正在使用的锁。
我读到有一个 MULTI_THREADING 选项,但它不能与 MVCC 一起使用,这很遗憾,因为我觉得如果我删除 MVCC=TRUE 我需要两个选项,这意味着 h2 将在我每次插入或插入时锁定表更新,因为我只有几个表,它们几乎总是被锁定。
所以,我觉得可以大大减少阻塞,但我不清楚潜在的问题是什么以及如何进行
测试这是我的起点,测试用例需要 3 分 14 秒
3:14,FILE_LOCK=SOCKET;MVCC=TRUE;DB_CLOSE_ON_EXIT=FALSE
我尝试了各种组合,例如
3:02,FILE_LOCK=SOCKET;MVCC=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOG=0;CACHE_SIZE=65536;LOCK_MODE=0;
2:56,FILE_LOCK=SOCKET;MVCC=TRUE;DB_CLOSE_ON_EXIT=FALSE;LOG=0;;CACHE_TYPE=SOFT_LRU;LOCK_MODE=0;
1:05,FILE_LOCK=SOCKET;DB_CLOSE_ON_EXIT=FALSE;LOCK_TIMEOUT=10000
我发现唯一产生巨大差异的是删除了 MVCC=TRUE 选项,但不幸的是我的锁超时次数从几乎为零增加到加载,所以不幸的是一些所需的处理没有发生,这可能是总时间更快的原因 因为应用程序中的某些阶段未完成,或者使用 MVCC 会减慢速度。
我尝试使用 MULTI_THREADED=TRUE 但它似乎对我根本不起作用
关于在多核系统中的使用
我刚刚阅读了 MULTI_THREADED 选项的解释 https://groups.google.com/forum/#!topic/h2-database/VoE3AU7mSuM
托马斯说
The default is "not multi-threaded" meaning only one statement can run at any time (per database). There is a synchronized block around running a statement. When multi-threaded is enabled, then the synchronized statement is on the session (connection) instead of on the database object.
The option is to increase concurrency, not throughput. The default setting is usually not a problem except if you have long running queries.
如果我理解正确,这意味着当禁用时,虽然 h2 可以接受多个连接,但它一次只会处理一个查询,但即使启用它,它也会在查询中途交换,但实际上仍然只是一次处理一个查询,即它可以开始处理查询 1,然后交换到查询 2,然后返回查询 1 等等,但永远不会实际使用 cpu 并行处理查询 1 和查询 2。
所以在任何一种情况下,尽管在 cpu 之间切换,它在任何时候都只会使用一个 cpu。因此,如果您有一台功能强大的机器,例如有 16 个内核,而瓶颈是数据库,那么添加更多内核根本无济于事因为 h2 一次只使用一个内核?
这似乎是一个真正的限制,我想知道它与 Derby 或任何其他嵌入式 Java 数据库相比如何。
最佳答案
有些线程被阻塞,可能是,是的,但我会首先专注于那些未被阻塞的线程,这意味着它们正在消耗 CPU时间或磁盘 I/O。那些陈述是什么?他们是不使用索引的查询吗?你有索引吗?或者您是否不必要地插入/删除行?另请参阅有关 how to analyze performance problems 的文档.
关于hibernate - 我怎样才能阻止 h2 如此频繁地阻止我的 hibernate 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18782331/
我尝试在安装了多类型 MFC 库的 visual studio 2015 MFC 上运行以前编写的 MFC c++ 代码。 但是,我这里仍然有 12 个关于缺少函数的错误: IntelliSense:
我正在学习 OOP 并且有疑问。假设我有一个包含 ClassB.h 的文件 ClassA.h,并且在某些时候我的 ClassB.h 需要包含 ClassA .h。 这会产生一个错误,我想我明白为什么会
我开始使用 CUDA 进行编程,在一些示例中我找到了包含文件 cuda.h、cuda_runtime.h 和 cuda_runtime_api.h 包含在代码中。有人可以向我解释一下这些文件之间的区别
我有一些生成正则表达式的代码。那么下面的表达式实际上是: ^(?:\s*((exclude|include|hide|show|protect|risk|dir-merge|merge)),\s*((
我一直在查看一些源代码,以更好地了解我们使用的这款游戏的核心,并编写更可靠、更快速的插件。然后我发现了这段奇怪的代码...... public void setMaxH(double amount)
通常我们会使用标准类型作为 std::unordered_map 的键和值.但现在我需要自定义我自己的键和值类。 键类在block_cache_key.h 中定义如下: #ifndef BLOCK_C
例如,我想要两个头文件,它们可以依赖于另一个头文件中的函数。 //Header1.h file #include Header2.h void h1(){ //... func1(); } v
我正在研究来自 Sedgewick 的 Shell 排序 Algorithms in C part 1-4在第 172 页。 我使用 size (数组的长度),而不是 l和 r (开始和结束);所以我
我在 macOS BigSur 上通过 VMWare 使用 Ubuntu 20.04.2 LTS。我安装了最新版本的 tcl、tcl-dev、tk 和 tk-dev - 版本 8.6。我想编译 Arc
我用我的 glu 和 gl 头文件构建了一个 OpenGL 程序,默认包含在 windows 7 专业版中。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须在我的项目中包含 g
我想在 token 中保留特殊字符,同时仍对特殊字符进行 token 化。说我有话 "H&R Blocks" 我想将其标记为 "H", "R", "H&R", "Blocks" 我读了http://w
关于 hash 作为 trans 参数的另一个问题。在下面的代码中,简单地使用 hash 会给出不正确的结果,但是将其替换为 keys 和 values 会使其正确。怎么了? my @alph1 =
我已经编写了一个 C 程序,它获取屏幕像素的 RGB 值 (0-255),并知道其位置 (x,y)。它可以在 Linux 中运行,但是当我尝试在 Visual Studio (Windows) 中编译
我已经使用 Windows 7 专业版中默认包含的 glu 和 gl 头文件构建了一个 OpenGL 程序。现在,我买了一本描述 OpenGL 游戏开发的书。这本书的作者说,我必须将glew head
#include using namespace std; #include //#include int main() { initscr();
h:messages h:form 内的组件还显示与外部组件相关的消息。 如何限制它只显示与包含 h:form 内的组件相关的消息? 我不喜欢用单独的h:message来使我的代码膨胀。每个输入组件的
我下载了示例代码和 cpp 文件,其中包含 list.h、queue.h 和 vector.h 等头文件,如果我尝试构建,我会收到“ fatal error :没有这样的文件或目录编译终止”我想我应该
我有一个编译成功的桌面项目,但是在我向项目添加新配置以支持 Windows Mobile 平台后,我收到以下错误: error C2146: syntax error : missing ';' be
有很多关于这个错误的帖子,但我无法解决它,我希望你能拿出解决方案。我在 Ubuntu 机器上。 ~/graphmap2$ 在这个文件夹中,我下载了 zlib。可以看图 经过一番谷歌搜索后,我还注意到没
是否可以在 Visual C++ 中使用以下 header : 图.h dos.h bios.h 最佳答案 据我所知,无法在 Visual C++ 中使用它, 与此同时,我希望您关注 Open Wat
我是一名优秀的程序员,十分优秀!