JDBCでWSL2上にあるSQLiteファイルを開くには
WSLでは \\wsl.localhost\(ディストリビューション名) で、エクスプローラー等からWSL上のファイルを開くことが出来る。非常に便利であるが、DBeaver等のJDBCからSQLiteのDBファイルに同じように接続しようとして、jdbc:sqlite:\\wsl.localhost\(ディストリビューション名)\...\XXXX.sqlite のように設定すると、接続自体は成功するが、テーブルの一覧取得をしようとした時に以下のようなエラーが発生し、実質使い物にならない。
[SQLITE_BUSY] The database file is locked (database is locked)
DBeaverのリポジトリで課題として起票されている(sqlite locked when opening from wsl path · Issue #17217 · dbeaver/dbeaver)が、クローズされておらず、今のところ解決できていない。
だが、その課題の後半にも言及があるが、どうもロックをしないように設定 nolock=1 すると接続が出来るようだ。
代償もあるようだが、SELECTで少し確認するくらいなら、これで特に問題ないと思う。
しかし、JDBC URLの記載ルールが非常にシビア。最初適当に変更してみたらうまくいかず、この記事を見て何とか接続できた感じ。記事の内容を整理すると、具体的な条件は以下の通り。
- fileプロトコル
file:を付与する。 - パス区切りは
\を用いる。/だと上手く動かない。 - 末尾に
?nolock=1を追加する。
先に挙げた例だと以下のようにする必要がある。
jdbc:sqlite:file:\\wsl.localhost\(ディストリビューション名)\...\XXXX.sqlite?nolock=1
Windows 10の場合は、wsl.localhost → wsl$ とする必要があるかもしれないが、それでも動くようだ。(そもそも先述の課題に記載があるのはこっち)