2014 年 11 月 18 日更新:
私が最初に提供した答えにはいくつかの問題があることがわかりました!取得したパスワードは eclipselink によって暗号化されているため、直接使用することはできません。ここでパスワードをハードコーディングできますが、それは良くないかもしれません。私が見つけたより良い方法は、エンティティ マネージャー ファクトリを作成するときにカスタム DataSource オブジェクトを渡すことでした。
additionalProperties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, dataSource);
emf = Persistence.createEntityManagerFactory(persistUnit, additionalProperties);
こちらのサンプル コードをご覧ください: https://github.com/jiakuan/wise-persist/blob/master/src/main/java/org/wisepersist/EntityManagerFactoryProvider.java
元の回答:
私は同じ問題を抱えており、カスタム SessionCustomizer を作成することで、eclipselink で bonecp データソース (c3p0 も同様である必要があります) を使用できることがわかりました。このようなもの:
public class JpaSessionCustomizer implements SessionCustomizer {
private static final Logger log = LoggerFactory.getLogger(JpaSessionCustomizer.class);
@Override
public void customize(Session session) throws Exception {
DatabaseLogin databaseLogin = session.getLogin();
String jdbcDriver = databaseLogin.getDriverClassName();
String jdbcUrl = databaseLogin.getDatabaseURL();
String username = databaseLogin.getUserName();
// WARNING: databaseLogin.getPassword() is encrypted,
// which cannot be used directly here
String password = "please use hard-coded password here";
log.debug("jdbcDriver={}, jdbcUrl={}, username={}, password={}",
jdbcDriver, jdbcUrl, username, password);
BoneCPDataSource dataSource = buildDataSource(jdbcDriver, jdbcUrl, username, password);
databaseLogin.setConnector(new JNDIConnector(dataSource));
}
private BoneCPDataSource buildDataSource(String jdbcDriver,
String jdbcUrl,
String username,
String password) {
BoneCPDataSource dataSource = new BoneCPDataSource();
dataSource.setDriverClass(jdbcDriver); // Loads the JDBC driver
dataSource.setJdbcUrl(jdbcUrl);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setConnectionTimeout(15, TimeUnit.SECONDS);
dataSource.setAcquireRetryAttempts(10);
dataSource.setConnectionTestStatement("SELECT 1");
dataSource.setIdleConnectionTestPeriodInSeconds(30);
dataSource.setPartitionCount(2);
dataSource.setMinConnectionsPerPartition(5);
dataSource.setMaxConnectionsPerPartition(10);
dataSource.setDisableConnectionTracking(true);
return dataSource;
}
}
eclipselink で c3p0 を使用する場合は、おそらくこのページ ( http://www.mchange.com/projects/c3p0/#using_combopooleddatasource ) に記載されているコードを buildDataSource メソッドで使用するだけで済みます。
いくつかの便利なリンク: