我继承了一些使用OSGi包中Apache commons dbcp连接池的代码。这段代码适用于Eclipse/Equinox OSGi 3.4.3版(R34x_20081215)、commons dbcp 1.2.2和springsource.org的postgres jdbc3 8.3.603包。
我想现代化,也许这是我的第一个错误!
当我将新版本的Felix或Equinox OSGI内核与新的postgresql JDBC3或JDBC4包以及最新版本的commons dbcp(1.4.1)一起使用时,我遇到了一个类加载问题。我做了大量的搜索,发现commons dbcp代码应该有一个fixDBCP-214,但它似乎仍然失败。
我试图将org.postgresql放在commons dbcp MANIFEST.MF import包行上,但这也不起作用。
我在一个激活器中编写了一个简单的测试,它首先执行一个basic class.forName()和DriverManager.get connection(),这很好,但是当我添加BasicDataSource()并设置与BasicDataSource.getConnection()的连接时,我得到了ClassNotFoundException。请参阅下面的代码示例。
提前感谢任何帮助,建议。。。
秀!
// This one fails with an exception
public void dsTest() {
BasicDataSource bds = new BasicDataSource();
ClassLoader cl;
try {
logger.debug("ContextClassLoader: {}",
Thread.currentThread().getContextClassLoader().toString());
cl = this.getClass().getClassLoader();
logger.debug("ClassLoader: {}", cl);
if (bds.getDriverClassLoader() != null) {
logger.debug(bds.getDriverClassLoader().toString());
}
// The failure is the same with and with the setDriverClassLoader() line
bds.setDriverClassLoader(cl);
bds.setDriverClassName("org.postgresql.Driver");
bds.setUrl("jdbc:postgresql://127.0.0.1/dbname");
bds.setUsername("user");
bds.setPassword("pword");
Class.forName("org.postgresql.Driver").newInstance();
conn = bds.getConnection();
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
conn.close();
logger.debug("Closed DataSource Test");
} catch (Exception ex) {
ex.printStackTrace();
logger.debug("Exception: {} ", ex.getMessage());
}
}
// This one works
public void managerTest() {
ClassLoader cl;
try {
cl = this.getClass().getClassLoader();
logger.debug("ClassLoader: {}", cl);
Class.forName("org.postgresql.Driver").newInstance();
String url = "jdbc:postgresql://127.0.0.1/dbname";
conn = DriverManager.getConnection(url, "user", "pword");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT COUNT(*) FROM table");
conn.close();
logger.debug("Closed Manger Test");
} catch (Exception ex) {
ex.printStackTrace();
logger.debug("Exception: {} ", ex.getMessage());
}
}
最佳答案
这是因为commons dbcp包不能查看实际的驱动程序类,因为osgi类加载器。解决方案是使用动态导入*将一个片段附加到commons dbcp类。清单中需要的实际标题如下:
片段宿主:org.apache.commons.dbcp
动态导入包:*
在这之后,你提到的代码起作用了。希望不要来得太晚。
关于postgresql - OSGI和Apache Commons-DBCP类加载问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2502308/