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が原因だと思います。私を助けてください。ありがとう。