动态载入jdbc 驱动Jar。J2SE4-J2SE5专用

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值