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 将 bonecp 数据源(c3p0 应该类似)与 eclipselink 一起使用。像这样的东西:
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,也许您只需要在 buildDataSource 方法中使用本页 ( http://www.mchange.com/projects/c3p0/#using_combopooleddatasource ) 中提到的代码。
一些有用的链接: