我将 MySQL 集成到 Apache Felix 中。首先,我使用 bndtools 生成 MySQL bundle 和 c3p0 bundle。然后我将它们全部添加到我的 Apache Felix 环境中。我为连接池创建了一个类,如下所示:
公共最终类 C3P0Manager {
私有静态 C3P0Manager 实例;
私有数据源池;
私人 C3P0Manager() {
// 当然,最好把所有的属性都放到一个配置文件中。
// 我只是在这里列出它们以方便阅读。
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass("com.mysql.jdbc.Driver"));
cpds.setJdbcUrl("jdbc:mysql://localhost/my-database?autoReconnect=true&characterSetResults=UTF-8&characterEncoding=UTF-8&useUnicode=yes");
cpds.setUser("用户");
cpds.setPassword("密码");
cpds.setInitialPoolSize(3);
cpds.setMaxPoolSize(15);
cpds.setMaxIdleTime(1800);
cpds.setAutoCommitOnClose(true);
汇集(cpds);
}
公共静态 C3P0Manager 实例()抛出异常 {
如果(实例==空){
实例 = 新 C3P0Manager();
}
返回实例;
}
公共数据源 getPooled() 抛出 SQLException {
归集归还;
}
}
如果我运行 JUnit 测试,它工作正常。但是在我的 Apache Felix 捆绑包上运行时失败,出现异常消息。在 Activator 类中的用法:
Class.forName("com.mysql.jdbc.Driver");
DataSource pooled = C3P0Manager.instance().getPooled();
连接 con = pooled.getConnection();
PreparedStatement stmt = null;
结果集 rs = null;
整数;
尝试 {
stmt = con.prepareStatement("SELECT count(*) FROM users", Statement.NO_GENERATED_KEYS);
rs = stmt.executeQuery();
如果(rs.next()){
总计 = rs.getInt(1);
}
} 捕捉(异常 e){
e.printStackTrace();
} 最后 {
尝试 {
rs.close();
stmt.close();
} 捕捉(异常前){
ex.printStackTrace();
}
}
System.out.println("总计 = " + 总计);
错误信息:
java.sql.SQLException:无法从底层数据库获取连接!
在 com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106)
在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529)
在 com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128)
...
原因:com.mchange.v2.resourcepool.CannotAcquireResourceException:ResourcePool 无法从其主工厂或源获取资源。
在 com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319)
在 com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557)
在 com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477)
在 com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525)
...
如果我只使用(没有 c3p0),MySQL 就可以工作:
Class.forName("com.mysql.jdbc.Driver");
连接 con = DriverManager.getConnection("jdbc:mysql://localhost/my-database?autoReconnect=true&characterSetResults=UTF-8&characterEncoding=UTF-8&useUnicode=yes","user","password");
语句语句 = connect.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT count(*) FROM users");
所以我认为问题是由于c3p0。请帮我。谢谢。