有的时候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,可以先把其他的代码进行下去,以后可以再回到这里慢慢完善。