连接到 H2 数据库时 MV_STORE = false 是啥意思?

Posted

技术标签:

【中文标题】连接到 H2 数据库时 MV_STORE = false 是啥意思?【英文标题】:What does MV_STORE = false mean when connecting to H2 database?连接到 H2 数据库时 MV_STORE = false 是什么意思? 【发布时间】:2020-12-08 23:27:02 【问题描述】:

我正在开发一个带有 GUI 的嵌入式数据库以与之通信。

我很好奇我的网址中的MV_STORE = false 是什么意思?

public DBconnect() throws SQLException, ClassNotFoundException
        clients = FXCollections.observableArrayList();
        Class.forName("org.h2.Driver");
        c = DriverManager.getConnection
                ("jdbc:h2:~/Database;MV_STORE=false", "admin", "Fitness1");
     

【问题讨论】:

h2database.com/html/mvstore.html#storageEngine 好问题。但请在此处发帖时使用正确的英语:“I am”或“I'm”,而不是“im”。这个网站更像是***,而不是一个休闲聊天室。这次我编辑了你的文字。 【参考方案1】:

存储引擎

H2 提供了多个storage engine 用于保存数据。

MVStore 是这些存储引擎之一,是最新的和当前的默认值。

引用彻底的documentation page on MV_STORE:

H2 存储引擎

对于 H2 1.4 及更高版本,MVStore 是默认存储引擎(支持 SQL、JDBC、事务、MVCC 等)。对于旧版本,请将 ;MV_STORE=TRUE 附加到数据库 URL。

据推测,将该标志设置为 false 会使用备用存储引擎。

是否选择 MVStore

至于你为什么会选择使用或避免使用MVStore,我不知道详情。一个搜索引擎在 2015 年 8 月以 Thomas 的名字出现了 this old Google Groups post,所以我想知道这可能是 H2 的发明者 Thomas Mueller。

嗨,

MVStore 相对较新,还不如旧的存储机制(PageStore)成熟。另请参阅 http://h2database.com/html/mvstore.html 的文档。与 PageStore 相比的一些优点是:多版本、更简单、更多并发、写入更少、针对 SSD 进行了优化。缺点是暂时需要更多的磁盘空间,目前速度有点慢。

PageStore 已经相当成熟,未来一段时间会得到支持。但是,支持最终会被淘汰。

问候,

托马斯

我假设现在在 2020 年与 2015 年相比,并且作为 H2 版本 1.4 的默认设置,关于“新且尚未成熟”的部分不再是这种情况。

多版本并发控制(MCC 或 MVCC)

通过一些快速搜索和阅读,新的 MVStore 和旧的 PageStore 之间的主要区别似乎是对 multiversion concurrency control (MCC or MVCC) 的支持。

MVCC 支持是较新的 MVStore 的一项关键功能,并且始终处于启用状态。 旧版 PageStore 中的 MVCC 支持是实验性的,最终放弃了。

查看问题页面:

Always use MVCC with MVStore and never use it with PageStore #1204 于 2018 年 6 月开业。 Remove useless MVCC / no MVCC conditions from MVStore code #1209

顺便说一句,通常建议使用javax.sql.DataSource 实现来获取连接,而不是使用您的示例代码中看到的DriverManager

H2 提供了org.h2.jdbcx.JdbcDataSource 类作为这样的实现。有关您可以设置的选项列表,请参阅 this documentation page。

JdbcDataSource ds = new org.h2.jdbcx.JdbcDataSource();
ds.setURL( "jdbc:h2:~/Database" );
ds.setUser( "scott" );
ds.setPassword( "tiger" );
return ds ;  // Return as the more general `javax.sql.DataSource` rather than H2-specific implementation.

【讨论】:

另一种存储引擎是什么?在什么情况下将 MV_STORE 设置为 false? @GPell7 我添加了另一个部分来解决您的评论。

以上是关于连接到 H2 数据库时 MV_STORE = false 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

使用 h2o.init() 连接到外部实例时向 H2O 添加额外的 jar

尝试连接到 Activiti 的 H2 数据库设置时出现异常

使用 Java 应用程序远程连接到 H2 数据库

如何从 Java 和 H2 DB 连接到 H2 数据库

使用 IDEA 连接到 H2

我无法连接到 H2 数据库