使用 JAVA 线程在 hsqldb 中进行并发访问
Posted
技术标签:
【中文标题】使用 JAVA 线程在 hsqldb 中进行并发访问【英文标题】:Concurent access in hsqldb with JAVA Thread 【发布时间】:2014-01-16 12:59:06 【问题描述】:我使用多线程编写JAVA程序, 我有超过 5000 个线程,每个线程访问同一个表以插入或选择数据(不更新)。
我在 Hibernate/Spring 中使用 HSQLDB(文件模式)。
我使用多线程的原因是为了减少执行时间,但表是由一个线程访问的。
我为多版本控制配置了hsqldb.tx=mvcc
,但任何更改
有人知道如何允许多个线程同时访问同一个表吗?
【问题讨论】:
你正在使用的线程数量太可笑了,相反,它肯定不会让任何事情变得更快。你也应该考虑一个真正的数据库,我怀疑 HSQLDB 可以与 mysql 或 MariaDB 等产品相比。 问题不是线程的数量,假设我的cpu有能力同时运行很多线程。问题是事实上我可以为其他操作运行许多线程,我不能对数据库访问做同样的事情。写入和读取事务锁定数据文件。 你的 CPU 可以同时运行在 10 个线程下。 5000 个线程是可以同时运行的数量的 500 倍以上,因此仅在线程之间进行上下文切换就浪费了很多时间。非常低效,您应该在尝试这样的事情之前阅读多线程。 @Kayaman - 使用 MySQL 等不会更快,而且 HSQLDB 与这些数据库相比非常好 @fredt 是的,我没有看过 HSQLDB 的性能,所以这可能无效。但是 5000 个线程意味着有人不知道如何多线程.... :) 【参考方案1】:使用多个线程从表中进行 SELECT 可以提高性能,因为线程可以同时访问同一个数据库表。
当多个线程对表执行 INSERT 时,数据库必须一次执行一个 INSERT 语句,因为可能存在必须在队列中检查的 PRIMARY KEY 或 UNIQUE 约束以防止数据库中的不一致。
在任何情况下,计算机都能够同时运行多个 CPU 内核的线程。如果您有更多线程,它们会被操作系统排队。
【讨论】:
【参考方案2】:感觉HSQLDB文件模式,hsql模式和res模式不支持多线程或者多用户同时连接。我还在检测执行同时任务所需的模式
【讨论】:
以上是关于使用 JAVA 线程在 hsqldb 中进行并发访问的主要内容,如果未能解决你的问题,请参考以下文章
HSQLDB:.script 文件在多个项目执行[多线程环境]并行期间自动被删除?