直接查询表和查询H2数据库中的视图之间的RAM使用情况有所不同吗?

问题描述 投票:0回答:0
我无法决定要使用什么(直接的SQL查询或查询查看),以减少RAM使用。

直接查询表和在H2数据库中查询视图之间的RAM使用情况有所不同吗? H2数据库中RAM的要求是什么? 我得到一个org.h2.jdbc.jdbc.jdbcsqlnontransientException由org.h2.mvstore.mvstore.mvstoreexception引起

数据库已损坏

我认为问题是由于不足的免费RAM引起的。

RAM的数量有限,将受到限制。 我不知道如何防止数据库损坏。

这里是我问题的补充。 我有一个用Java(Javafx + Spring Boot + H2数据库)编写的桌面应用程序。 该应用程序使用嵌入式数据库。该应用程序可以使用H2服务器,但使用嵌入式DB。

该应用程序使用SQL视图,该视图连接了23个表和其他视图。 我无法创建实现的视图,因为H2数据库不支持此类型的视图。

该应用程序有很多用户。用户数据库具有不同量的数据。 问题是我无法访问这些数据库。 我只有有关数据库问题的消息。 使用者计算机具有8GB的RAM。

我知道OpenJDK中的默认-XMX值是非服务器机器的物理内存的四分之一。 我决定使用更多RAM(-XMX4G),但数据库的错误会定期发生。 today我收到了下面的消息。

Caused by: org.h2.jdbc.JdbcSQLNonTransientConnectionException: File corrupted while reading record: "... .mv.db". Possible solution: use the recovery tool [90030-224] at org.h2.message.DbException.getJdbcSQLException(DbException.java:690) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:212) at org.h2.mvstore.db.Store.convertMVStoreException(Store.java:163) at org.h2.mvstore.db.Store.<init>(Store.java:142) at org.h2.engine.Database.<init>(Database.java:326) at org.h2.engine.Engine.openSession(Engine.java:92) at org.h2.engine.Engine.openSession(Engine.java:222) at org.h2.engine.Engine.createSession(Engine.java:201) at org.h2.engine.SessionRemote.connectEmbeddedOrServer(SessionRemote.java:343) at org.h2.jdbc.JdbcConnection.<init>(JdbcConnection.java:125) at org.h2.Driver.connect(Driver.java:59) at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138) at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:359) at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201) at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:470) at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:733) at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:712) at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642) ... 1 common frames omitted Caused by: org.h2.mvstore.MVStoreException: Double mark: 357/16f [2-32, 39-34c, 357-3c6, 3ca-3d2, 3da-3e9, 3ee-4d7, 4fc-520, 532-56a, 6ee-] [2.2.224/6] at org.h2.mvstore.DataUtils.newMVStoreException(DataUtils.java:996) at org.h2.mvstore.FreeSpaceBitSet.markUsed(FreeSpaceBitSet.java:184) at org.h2.mvstore.RandomAccessStore.markUsed(RandomAccessStore.java:75) at org.h2.mvstore.RandomAccessStore.readStoreHeader(RandomAccessStore.java:333) at org.h2.mvstore.FileStore.start(FileStore.java:916) at org.h2.mvstore.MVStore.<init>(MVStore.java:289) at org.h2.mvstore.MVStore$Builder.open(MVStore.java:2035) at org.h2.mvstore.db.Store.<init>(Store.java:133) ... 17 common frames omitted

问题是“直接查询表和查询H2数据库中的视图之间的RAM使用情况有所不同吗?”。

可能我对这个问题有任何答案吗?

如果我对MVStoreException有任何评论,那也将很有用。

提前感谢

the the @life8888888, @community bot已经指出了一些关键的事情。

-comparing -eviews vs直接查询和RAM用法 - 由于您的视图加入了

23表

(加上其他视图),它绝对使用的是直接查看表的内存更多。每次运行查询时,H2都必须重新计算所有这些连接,这可能很昂贵。如果RAM受到限制,则可以将其分解为较小的查询,优化索引,甚至使用临时表,从而获得更好的性能。

数据库损坏 - 
这通常是由于记忆力低或关闭不当而发生。您已经增加到4GB,但是H2之类的设置也可以帮助更好地管理内存。另外,由于您正在运行嵌入式模式,因此意外的崩溃可以更容易损坏数据库。切换到H2服务器模式可能有助于避免这种情况。

@@Life888888有一个很好的观点 - 您的实际数据集有多重要?我们是在谈论10,000唱片还是1000万唱片?您是否尝试过运行

-Xmx

查看查询的哪一部分正在吞噬记忆?这可能有助于找出导致高RAM使用的原因。让我们知道情况如何。

java database memory-management h2 data-corruption
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.