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.localhostwsl$ とする必要があるかもしれないが、それでも動くようだ。(そもそも先述の課題に記載があるのはこっち)

参考