有的時(shí)候jdbc驅(qū)動(dòng)它不是放在classpath里的,而是要你寫程序動(dòng)態(tài)載入的。
J2SE6有API給你修改classpath,但是4-5版本里就只有用URLClassLoader載入。
問(wèn)題是,URLClassLoader載入的類,在SystemClassLoader里還是找不到。
舉個(gè)例子就是
只有用Class.forName(String,boolean,ClassLoader)這樣指定ClassLoader才能找的到這個(gè)類。
但是有些Pool,比如C3P0,他沒(méi)有考慮到這一點(diǎn),還是用SystemClassLoader去load,每次都報(bào)找不到驅(qū)動(dòng),搞得我很痛苦。
先想了一個(gè)walkaround,就是自己寫一個(gè)DataSource。這里我寫點(diǎn)大意代碼。
J2SE6有API給你修改classpath,但是4-5版本里就只有用URLClassLoader載入。
問(wèn)題是,URLClassLoader載入的類,在SystemClassLoader里還是找不到。
舉個(gè)例子就是
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()});
classLoader.loadClass(driverClass); // OK
Class.forName(driverClass); // NG
Class.forName(driverClass,true,classLoader);// OK
classLoader.loadClass(driverClass); // OK
Class.forName(driverClass); // NG
Class.forName(driverClass,true,classLoader);// OK
只有用Class.forName(String,boolean,ClassLoader)這樣指定ClassLoader才能找的到這個(gè)類。
但是有些Pool,比如C3P0,他沒(méi)有考慮到這一點(diǎn),還是用SystemClassLoader去load,每次都報(bào)找不到驅(qū)動(dòng),搞得我很痛苦。
先想了一個(gè)walkaround,就是自己寫一個(gè)DataSource。這里我寫點(diǎn)大意代碼。
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()});
Class clazz = classLoader.loadClass(driverClass); // OK
Driver driver = (Driver)clazz.newInstance();
//

private class URLDataSource implements DataSource {

/* (non-Javadoc)
* @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
*/
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
return driver.connect(jdbcurl, props);
}

}
這樣就可以取到一個(gè)自己的DataSource,可以先把其他的代碼進(jìn)行下去,以后可以再回到這里慢慢完善。Class clazz = classLoader.loadClass(driverClass); // OK
Driver driver = (Driver)clazz.newInstance();
//


private class URLDataSource implements DataSource {

/* (non-Javadoc)
* @see javax.sql.DataSource#getConnection(java.lang.String, java.lang.String)
*/
public Connection getConnection(String username, String password) throws SQLException {
// TODO Auto-generated method stub
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
return driver.connect(jdbcurl, props);
}

}