web-dev-qa-db-ja.com

修正方法:埋め込みH2データベース「NonTransientError:ページの位置を読み取れません」エラー?

ユーザーのログインとパスワードの処理に使用される、H2データベースが埋め込まれたJavaFXプログラムを作成しています。 Intellij Ultimateを使用して、ツールバーから実行できるデータベースがあります。さらに、正しいJDBCドライバーとURLを持っていることはほぼ確実です。データベースはIntellijのデータベースコンソールから正常に実行されます。 Javaコードでデータベースにアクセスしようとすると、エラーが発生します。データベース接続を処理するためにデータベースクラスを使用しています。

JdbcSQLNonTransientExceptionが表示されます、一般的なエラー:

不正な状態の例外:位置のページを読み取れません

原因:Java.lang.IllegalStateException:サポートされていないタイプ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」からデータを取得することを期待しています。コードは上記のエラーでコンパイルされません。

編集:1.4.199ではなくH2のバージョン1.4.200を使用すると、問題は解消します。私はここでほぼ同じ問題を見つけました: https://github.com/h2database/h2database/issues/2078 。このリンクには、私のリンクと同じスタックトレースがあります。バージョン1.4.200の問題をまだ解決していません

5
Suede

このような質問では、エラーメッセージだけでなく、完全なスタックトレースを提供する必要があります。

また、表示されるメッセージはコンパイルエラーではありません。

通常、このようなメッセージは、データベースが破損していることを意味します。そこからデータが必要ない場合は、そのファイルをすべて削除して、最初から再作成できます。

あるツールからはデータベースを開くことができるが、アプリケーションからは開くことができない場合は、両方の場所で使用されているH2のバージョンを確認し、それらを調整します。 SCRIPT TO 'filename.sql'コマンドを使用してSQLスクリプトに対応するバージョンのデータベースをエクスポートし、そのスクリプトを使用してデータを新しいデータベースに入力し、破損しないことを確認します(希望するバージョン)。

0

@Yuraですでに述べたように、すべてのコードベースとすべてのツールが同じバージョンのドライバー(1.4.196または1.4.200)を使用していることを確認する必要があります。

次に、dbに価値のあるものがなかった場合は、dbファイルを安全にドロップして、再作成できます。

貴重なデータがあり、バックアップがない場合、dbを修復することは、必ずしも成功するとは限りません...

そして、バックアップがある場合、「backup-to-sql-using-196」と「restore-from-sql-using-200」の手順があなたのために仕事をする可能性が最も高いです http ://www.h2database.com/html/tutorial.html#upgrade_backup_restore ...

0
Sergey Ushakov