如何修复:嵌入式H2数据库“非瞬态错误:无法在位置读取页面”错误?

2022-09-02 22:01:05

我正在创建一个带有嵌入式H2数据库的JavaFX程序,该数据库将用于处理用户登录名和密码。使用Intellij Ultimate,我有一个可以从工具栏运行的数据库。此外,我几乎可以肯定我有正确的JDBC驱动程序和URL。数据库从 Intellij 的数据库控制台运行良好。当我尝试使用Java代码访问数据库时发生错误。我正在使用数据库类来处理我的数据库连接。

我收到 一般错误:JdbcSQLNonTransientException

非法状态异常:无法读取位置处的页面

由以下原因引起:java.lang.IllegalStateException: Unsupported type 17。

导致错误的编译器中显示的代码行:Connection conn = DriverManager.getConnection(DB_URL, "sa", "");

我试图在任何地方找到类似的问题,但找不到相关的问题。我尝试尽可能地简化我的类,以隔离问题并简单地建立连接。我删除了我的项目,并试图重新开始。

产生问题的简化类:DatabaseManager

public class DatabaseManager {
    static final String JDBC_DRIVER = "org.h2.Driver";
    static final String DB_URL = "jdbc:h2:D:/trant/Documents/Java Practice/Order A Car2/res/userDatabase";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        Class.forName("org.h2.Driver");
        Connection conn = DriverManager.getConnection(DB_URL, "sa", "");
        Statement st = conn.createStatement();
        st.executeUpdate("SELECT * FROM JOBS");
        conn.close();
    }
}

我希望连接到 H2 数据库并从表“JOBS”中检索数据。代码未使用上述错误进行编译。

编辑:如果我使用H2的1.4.199版本而不是1.4.200,问题就会消失。我在这里发现了一个几乎相同的问题:https://github.com/h2database/h2database/issues/2078。此链接具有与我的堆栈跟踪相同的堆栈跟踪。我尚未解决版本 1.4.200 的问题


答案 1

https://github.com/h2database/h2database/issues/2078 您应该使用相同的驱动程序,因此使用1.4.200(当前弹簧数据版本)进行修改后,无法读取1.4.196(IDEA使用)的驱动程序。因此,地雷崩溃场景在IDEA中打开db,驱动程序为1.4.196,而spring应用程序代码使用1.4.200。所以它不会再次开始。你可以在 pom.xml 中声明 1.4.196 版本,但看起来你将被限制到这个版本,我不知道如何完全修复你的数据库。


答案 2

正如 @Yura 中已经指出的那样,您需要确保所有代码库和所有工具都使用相同版本的驱动程序,无论是 1.4.196 还是 1.4.200。

接下来,如果您的数据库中没有任何有价值的东西,您可以安全地删除db文件,它将再次重新创建。

如果你有一些有价值的数据,你没有备份,那么修复数据库可能成为一项任务,不一定成功......

如果您有备份,那么“备份到sql-using-196”和“从sql-using-200恢复”的过程最有可能为您完成这项工作,请参阅 http://www.h2database.com/html/tutorial.html#upgrade_backup_restore ...


推荐