Eclipselink Pooling相当于C3PO

我试图阻止这种日志记录

从服务器成功收到的最后一个数据包是10,255毫秒。 成功发送到服务器的最后一个数据包是0毫秒前。

我已经在persistence.xml中使用auto reconnect设置了连接url

我想要的是会有一个连接池,每分钟或每小时检查连接,以便连接仍然存在。 Hibernate具有c3po的这个function。 喜欢ff。

1800  5 50 50 50 5 5 1 true select 1; true C3P0 

无论如何,我可以在eclipselink中做到这一点?

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; } } 

如果你想将c3p0与eclipselink一起使用,也许你只需要在buildDataSource方法中使用本页中提到的代码( http://www.mchange.com/projects/c3p0/#using_combopooleddatasource )。

一些有用的链接:

  • 如何创建自定义SessionCustomizer: http ://wiki.eclipse.org/Customizing_the_EclipseLink_Application_(ELUG)#Using_the_Session_Customizer_Class
  • 关于如何配置Eclipselink以使用c3p0的建议: http : //www.eclipse.org/forums/index.php/t/172073/

关于:警告:databaseLogin.getPassword()已加密;

您可以使用以下内容:

 Map props = session.getProperties(); ... dataSource.setPassword((String) props.get("javax.persistence.jdbc.password")); ... 

问候!!