Я интегрирую MySQL в Apache Felix. Во-первых, я использую bndtools для создания пакета MySQL и пакета c3p0. Затем я добавляю их все в свою среду Apache Felix. Я создаю класс для пула соединений, как показано ниже:
public final class C3P0Manager { private static C3P0Manager instance; private DataSource pooled; private C3P0Manager() { // Of course, it is better to put all properties into a configuration file. // I just list them here for easy reading. 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("user"); cpds.setPassword("password"); cpds.setInitialPoolSize(3); cpds.setMaxPoolSize(15); cpds.setMaxIdleTime(1800); cpds.setAutoCommitOnClose(true); pooled(cpds); } public static C3P0Manager instance() throws Exception { if (instance == null) { instance = new C3P0Manager(); } return instance; } public DataSource getPooled() throws SQLException { return pooled; } }
Он отлично работает, если я запускаю тест JUnit. Но не удалось при запуске на моем пакете Apache Felix с сообщением об исключении. Использование в классе Activator:
Class.forName("com.mysql.jdbc.Driver"); DataSource pooled = C3P0Manager.instance().getPooled(); Connection con = pooled.getConnection(); PreparedStatement stmt = null; ResultSet rs = null; int total; try { stmt = con.prepareStatement("SELECT count(*) FROM users", Statement.NO_GENERATED_KEYS); rs = stmt.executeQuery(); if (rs.next()) { total = rs.getInt(1); } } catch (Exception e) { e.printStackTrace(); } finally { try { rs.close(); stmt.close(); } catch (Exception ex) { ex.printStackTrace(); } } System.out.println("total = " + total);
Сообщения об ошибках:
java.sql.SQLException: Connections could not be acquired from the underlying database! at com.mchange.v2.sql.SqlUtils.toSQLException(SqlUtils.java:106) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:529) at com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource.getConnection(AbstractPoolBackedDataSource.java:128) ... Caused by: com.mchange.v2.resourcepool.CannotAcquireResourceException: A ResourcePool could not acquire a resource from its primary factory or source. at com.mchange.v2.resourcepool.BasicResourcePool.awaitAvailable(BasicResourcePool.java:1319) at com.mchange.v2.resourcepool.BasicResourcePool.prelimCheckoutResource(BasicResourcePool.java:557) at com.mchange.v2.resourcepool.BasicResourcePool.checkoutResource(BasicResourcePool.java:477) at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool.checkoutPooledConnection(C3P0PooledConnectionPool.java:525) ...
MySQL работает, если я просто использую (без c3p0):
Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost/my-database?autoReconnect=true&characterSetResults=UTF-8&characterEncoding=UTF-8&useUnicode=yes","user","password"); Statement statement = connect.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT count(*) FROM users");
Думаю, проблема в c3p0. Помогите, пожалуйста. Спасибо.