我将 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。请帮我。谢谢。