あなたの問題に答える前に、3つの質問があります。
ステートメント1:
ya, I have set the classpath of mysql jar in the environment variables, do we need to set it through system properties?
Q1:クラスパスからシステムクラスローダーがクラスをすぐに利用できるのに、なぜカスタムクラスローダーに依存するのですか?カスタムクラスローダーを使用するために
明示的なクラスパスは必要ありません。mysql***.jar
ステートメント2:
Class sqldriver = urlCl.loadClass("com.mysql.jdbc.Driver"); // Runtime loading
//Compilation failing as "sqldriver" class of type Driver is not found
Driver ds = (Driver) sqldriver.newInstance();
Q2:主張Compilation failing ...
は非常に矛盾しています。あなたのコンパイラはあなたのクラスを生成するためにそのようなクラスを探していますか!?
そうではないと確信しています。エラーは実行時に。である可能性がありますjava.lang.ClassNotFoundException: com.mysql.jdbc.Driver
。また、コメントは以下のステートメント3と一致する必要があると思います。
の場合CNFE
、へのファイルパスmysql***.jar
が間違っています。最初に修正してください。
ステートメント3:
//I am using now java.sql.Driver to remove the compilation error
//Runtime fail.. "Driver" Class not Found Exception.
sqldriver = Class.forName("com.mysql.jdbc.Driver", true, sqldriver.getClassLoader()).newInstance();
Q3:主張... "Driver" Class not Found Exception
は疑わしいです。なぜなら、このステートメントはコンパイルされないからです。それでは、どのようにしてランタイムが失敗するのでしょうか。..!?
また、コメントは上記のステートメント2と一致するはずです。ここでは、変数に割り当てる前に、を呼び出してからキャストする
必要があります。指定された文字列名を持つクラスまたはインターフェイスに関連付けられたオブジェクトのみを返すためです。上記のステートメント2の
問題が修正された場合は、この修正を適用してさらにテストできます。 newInstance()
java.sql.Driver
sqlDriver
Class.forName( ...
Class
これらのステートメントが明確になったことを願っています。
以下に動作するサンプルコードがあり、テスト済みの出力が表示されています。
import java.io.File; // and others as required
public class MySQLDriveClassLoader {
public static void main( String [] args ) throws Exception {
//File f = new File( "/home/ravinder/soft-dump/mysql-connector-java-5.1.18-bin.jar" );
File f = new File( "E:\\Soft_Dump\\mysql-connector-java-5.0.4\\mysql-connector-java-5.0.4-bin.jar" );
URLClassLoader urlCl = new URLClassLoader( new URL[] { f.toURI().toURL() }, System.class.getClassLoader() );
Class mySqlDriver = urlCl.loadClass( "com.mysql.jdbc.Driver" );
//*** Start: DEBUG *************************
//mySqlDriver.con // On pressing CTRL+SPACEBAR, after .con, IDE shows "No default proposals"
// meaning it still is not an instance of Driver, and hence can't call a method from Driver class.
//Incompatible conditional operand types Class and Driver
//System.out.println( mySqlDriver instanceof java.sql.Driver ) );
System.out.println( "mySqlDriver: " + mySqlDriver );
System.out.println( "Is this interface? = " + mySqlDriver.isInterface() );
Class interfaces[] = mySqlDriver.getInterfaces();
int i = 1;
for( Class _interface : interfaces ) {
System.out.println( "Implemented Interface Name " + ( i++ ) + " = " + _interface.getName() );
} // for(...)
Constructor constructors[] = mySqlDriver.getConstructors();
for( Constructor constructor : constructors ) {
System.out.println( "Constructor Name = " + constructor.getName() );
System.out.println( "Is Constructor Accessible? = " + constructor.isAccessible() );
} // for(...)
//*** End : DEBUG *************************
Driver sqlDriverInstance = ( Driver ) mySqlDriver.newInstance();
System.out.println( "sqlDriverInstance: " + sqlDriverInstance );
Connection con = null;
try {
/******************************************************************
// You may fail to register the above driver
// hence don't depend on DriverManager to get Connected
//DriverManager.registerDriver( sqlDriverInstance );
//Driver driver = DriverManager.getDriver( "com.mysql.jdbc.Driver" ); // ( "jdbc:mysql" );
Enumeration<Driver> enumDrivers = DriverManager.getDrivers();
while ( enumDrivers.hasMoreElements() ) {
Driver driver = enumDrivers.nextElement();
System.out.println( "driver: " + driver );
} // while drivers
//******************************************************************/
String dbUrl = "jdbc:mysql://:3306/test";
Properties userDbCredentials = new Properties();
userDbCredentials.put( "user", "root" );
userDbCredentials.put( "password", "password" );
// No suitable driver found for ...
//con = DriverManager.getConnection( dbUrl, "root", "password" );
// safely use driver to connect
con = sqlDriverInstance.connect( dbUrl, userDbCredentials );
System.out.println( "con: " + con );
Statement stmt = con.createStatement();
String sql = "select now()";
ResultSet rs = stmt.executeQuery( sql );
if ( rs.next() ) {
System.out.println( rs.getString( 1 ) );
} // if rs
} catch( Exception e ) {
e.printStackTrace(); // only for quick debug
} finally {
try { if ( con != null ) con.close(); } catch ( Exception ignoreThis ) {}
}
} // psvm(...)
} // class MySQLDriveClassLoader
コンパイルと実行が成功すると、次の出力が得られました。
mySqlDriver: class com.mysql.jdbc.Driver
Is this interface? = false
Implemented Interface Name 1 = java.sql.Driver
Constructor Name = com.mysql.jdbc.Driver
Is Constructor Accessible? = false
sqlDriverInstance: com.mysql.jdbc.Driver@1270b73
con: com.mysql.jdbc.Connection@32fb4f
2012-05-29 03:52:12.0