SQLException: No suitable driver found for

3
Kenji Yoshida @xuwei_k

jdbcのDriverを一度登録してるのに "SQLException: No suitable driver found for ..." と言われる現象が発生して、明示的DriverManager.registerDriverを呼んで登録し直すと成功するんだけどなにこれ・・・

2013-06-22 18:40:30
Kenji Yoshida @xuwei_k

https://t.co/ktFCaaUhOj Squeryl混ぜて使ったり、複数DBに接続したり色々やってて原因がよくわからないのだけど、その例外自体はscalikejdbcが依存してるapache dbcpがコネクション作ろうとするときに投げられてくる

2013-06-22 18:46:27
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k なんでしょうね。Play2 のユニットテストで登録済のはずのドライバーが見えなくなる事象があって場当たり的に Class.forName してやり過ごしたことはありましたけど。

2013-06-22 18:48:29
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k あ、これは scalikejdbc の PlayPlugin の FakeApp を使った unit test での話です。

2013-06-22 18:51:00
Toshiyuki Takahashi @tototoshi

@xuwei_k んー、再現しないです。たしか自分もそれ起きたことあって調べてわかんなかったんですよね。でそのうち出なくなってうやむやに。バージョンはなんですか?

2013-06-22 19:22:21
Kenji Yoshida @xuwei_k

@tototoshi versionあまり関係なさそうです。少なくともscalikejdbc1.6.0でも1.6.4でも発生した

2013-06-22 19:26:12
Toshiyuki Takahashi @tototoshi

@xuwei_k https://t.co/qxzGGtd3OM こんなんで再現するかなあと思ったんですが、動いちゃった

2013-06-22 19:30:29
Kenji Yoshida @xuwei_k

@xuwei_k 発生するコードが全然切り出せないので、とりあえずエラーログだけ晒しておく https://t.co/xuGoOEqVmz

2013-06-22 19:37:45
Kenji Yoshida @xuwei_k

@seratch @tototoshi https://t.co/smxyqXOW1Y このaddもしくはsingletonを明示的に何度か呼んでる(複数DB接続のために、同じ名前だったり違う名前だったりするかも)んですけど、なにか呼び方でやっちゃまずいパターンとかあります?

2013-06-22 19:42:43
Toshiyuki Takahashi @tototoshi

そういえばScalikejdbcのPlayPluginでonstopでderegisterDriverしたほういいんじゃないかなあと思ったりした。ここらへんわからないけどPlayのDBPluginはそうなってる。

2013-06-22 19:44:13
Toshiyuki Takahashi @tototoshi

@xuwei_k 知る限りそういうのはないと思います

2013-06-22 19:46:48
Kenji Yoshida @xuwei_k

あ、そうか、scalikejdbcもapache-dbcpもderegisterDriver呼んでないけど、PlayがonStopで呼んでるから、もしかしてそれか・・・

2013-06-22 19:49:16
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k @tototoshi 今外出中なので細かい話はできないですが、driver がいないこのエラーの場合はクラスローダーがらみとかそっち方面な気がします。再現パターンがわかるといいのですけどね。。

2013-06-22 19:53:12
Toshiyuki Takahashi @tototoshi

@xuwei_k あっ、もしかして、プラグインの優先順とか。

2013-06-22 19:54:53
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k もしかして自前で cp への add とか呼んでますか?そしたらそれとの絡みで今回の挙動になるでしょうね。

2013-06-22 19:56:55
Toshiyuki Takahashi @tototoshi

@xuwei_k でもonstartでまたロードされる気が。

2013-06-22 19:57:09
Kenji Yoshida @xuwei_k

@tototoshi え?それで変わります?あ、ちなみに今発生してるのでは、evolutions使ってる(DBPlugin使ってる)けどscalikejdbcはPlayプラグインとしてではなく単にライブラリとして使ってます(自分で直接scalikejdbの設定のメソッド呼んでる)

2013-06-22 19:57:35
Kazuhiro Sera (瀬良) @seratch_ja

@xuwei_k その場合はドライバーの面倒も自分でみる必要がありますね。

2013-06-22 19:59:04
Toshiyuki Takahashi @tototoshi

@xuwei_k あ、PlayPlugin使ってないんですね。なら起きそうです。

2013-06-22 20:00:04
Kenji Yoshida @xuwei_k

@tototoshi @seratch あれ、よくわかってないんですけど、PlayPlugin使ってるかどうかは直接関係ないような?scalikejdbcのPlayPluginはClass.forNameは呼んでるけど、registerDriverは直接呼んでないですよね?

2013-06-22 20:05:33
Kenji Yoshida @xuwei_k

PlayのDBPluginがderegisterDriverを呼ぶから、それを呼んだ後(同じClassLoader上のコードだと?)Class.forName呼ぶことで再登録しようとしても意味ない(static initializerだから)から、という結論に達しつつあるのだけど

2013-06-22 20:23:36
Yasushi Abe @yasushia

Java6でほぼ絶滅したものと思ってた。javaeeとかosgiみたいなclassloaderがアレな環境以外は。

2013-06-22 20:25:51
Yasushi Abe @yasushia

http://t.co/1QOwHaxQL9 jdbc4からだったか。postgresqlは3のもでてるのね。丁寧なことに3のほうにはjava.sql.Driver入ってないや

2013-06-22 20:35:36
Yasushi Abe @yasushia

なんでそんなことしてるのだろう

2013-06-22 20:37:17