有的時候jdbc驅動它不是放在classpath里的,而是要你寫程序動態載入的。
J2SE6有API給你修改classpath,但是4-5版本里就只有用URLClassLoader載入。
問題是,URLClassLoader載入的類,在SystemClassLoader里還是找不到。
舉個例子就是

   
URLClassLoader classLoader = new URLClassLoader(new URL[]{file.toURI().toURL()});

classLoader.loadClass(driverClass); 
// OK

Class.forName(driverClass);  
// NG

Class.forName(driverClass,
true,classLoader);// OK

只有用Class.forName(String,boolean,ClassLoader)這樣指定ClassLoader才能找的到這個類。
但是有些Pool,比如C3P0,他沒有考慮到這一點,還是用SystemClassLoader去load,每次都報找不到驅動,搞得我很痛苦。

先想了一個walkaround,就是自己寫一個DataSource。這里我寫點大意代碼。

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);
        }


}
這樣就可以取到一個自己的DataSource,可以先把其他的代碼進行下去,以后可以再回到這里慢慢完善。