|
|||||
|
対象: JDBC利用時、Class.forNameのClassNotFoundExceptionを回避するJavaのJDBCドライバを利用しようとして、JRubyインストールディレクトリ/libにちゃんとJDBCドライバを配置しているにも拘らず、Class.forNameメソッドでClassNotFoundExceptionがスローされる場合がある。これはクラスローダに起因する問題らしいのだが、回避策の1つはClass.forNameの代わりにjava_importでJDBCドライバをロードする方法である。 java_importではなく、import、include_classを用いても同様の結果が得られるはずであるが、以下の例ではjava_importを用いてJDBCドライバをロードしている。
require "java"
java_import "java.sql.DriverManager"
#java.lang.Class.for_name("com.mysql.jdbc.Driver") # Class.for_nameが失敗する
java_import "com.mysql.jdbc.Driver"
conn = DriverManager.get_connection("jdbc:mysql://localhost/test", "test", "test")
# DBアクセス
conn.close
java_importに渡すドライバ名は変数でも良いので、Class.forNameメソッドと同様に汎用的に利用することができる。特定のJDBCドライバしか利用しないのであれば、そのドライバクラスをnewしてDriverManager.registerDriverに渡す方法でもうまくいくことがある。
require "java"
java_import "java.sql.DriverManager"
java_import "com.mysql.jdbc.driver"
DriverManager.register_driver(com.mysql.jdbc.driver.new)
conn = DriverManager.get_connection("jdbc:mysql://localhost/test", "test", "test")
それでもClass.forNameメソッドにこだわるのであれば、クラスローダを指定する形式のforNameメソッドを呼び出すのも良いだろう。2番目の引数はドライバの初期化を行うか否か、3番目の引数はClassLoaderである。ここで重要となるのは、クラスローダとしてJRuby.runtime.jruby_class_loaderを指定することである。
# ClassLoaderを指定してClass.forName
java.lang.Class.for_name("com.mysql.jdbc.Driver", true, JRuby.runtime.jruby_class_loader)
(2010/08/07)
Copyright(C) 2004-2014 モバイル開発系(K) All rights reserved.
[Home]
|
|||||