MySQLをApacheFelixに統合します。まず、bndtoolsを使用してMySQLバンドルとc3p0バンドルを生成します。次に、それらすべてをApacheFelix環境に追加します。以下のように接続プールのクラスを作成します。
パブリックファイナルクラス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( "user"); cpds.setPassword( "password"); cpds.setInitialPoolSize(3); cpds.setMaxPoolSize(15); cpds.setMaxIdleTime(1800); cpds.setAutoCommitOnClose(true); pooled(cpds); } public static C3P0Manager instance()は例外をスローします{ if(instance == null){ インスタンス=新しいC3P0Manager(); } インスタンスを返します。 } public DataSource getPooled()はSQLException{をスローします プールされたリターン。 } }
JUnitテストを実行すると正常に動作します。しかし、Apache Felixバンドルで実行すると、例外メッセージが表示されて失敗しました。Activatorクラスでの使用法:
Class.forName( "com.mysql.jdbc.Driver"); プールされたデータソース=C3P0Manager.instance()。getPooled(); 接続con=pooled.getConnection(); PreparedStatement stmt = null; ResultSet rs = null; int合計; 試す { stmt = con.prepareStatement( "SELECT count(*)FROM users"、Statement.NO_GENERATED_KEYS); rs = stmt.executeQuery(); if(rs.next()){ 合計=rs.getInt(1); } } catch(例外e){ e.printStackTrace(); } ついに { 試す { rs.close(); stmt.close(); } catch(Exception ex){ ex.printStackTrace(); } } System.out.println( "total =" + total);
エラーメッセージ:
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)で ..。
MySQLは(c3p0なしで)使用するだけで機能します:
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"); ステートメントstatement=connect.createStatement(); ResultSet resultSet = statement.executeQuery( "SELECT count(*)FROM users");
したがって、問題はc3p0が原因だと思います。私を助けてください。ありがとう。