直接查询表和在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使用的原因。让我们知道情况如何。