我试图阻止这种日志记录
从服务器成功接收的最后一个数据包是10,255毫秒。成功发送到服务器的最后一个数据包是0毫秒前。
我已经在persistence.xml中使用auto reconnect设置了连接url
我想要的是会有一个连接池,每分钟或每小时检查连接,以便连接仍然存在。 Hibernate具有c3po的这个功能。喜欢ff。
<property name="hibernate.c3p0.timeout">1800</property> <!-- seconds -->
<property name="hibernate.c3p0.min_size">5</property>
<property name="hibernate.c3p0.max_size">50</property>
<property name="hibernate.c3p0.max_statements">50</property>
<property name="hibernate.c3p0.timeout">50</property>
<property name="hibernate.c3p0.numHelperThreads">5</property>
<property name="hibernate.c3p0.maxAdministrativeTaskTime">5</property>
<property name="statementCacheNumDeferredCloseThreads">1</property>
<property name="hibernate.c3p0.validate">true</property>
<property name="hibernate.c3p0.preferredTestQuery">select 1;</property>
<property name="hibernate.c3p0.testConnectionOnCheckout">true</property>
<property name="hibernate.c3p0.automaticTestTable">C3P0</property>
无论如何,我能在eclipselink中做到这一点吗?
2014年11月18日更新:
我发现我原来提供的答案有一些问题!检索到的密码由eclipselink加密,因此我们无法直接使用它。我们可以在这里硬编码我们的密码,但这可能不太好。我发现更好的方法是在创建实体管理器工厂时传递自定义DataSource对象。
additionalProperties.put(PersistenceUnitProperties.NON_JTA_DATASOURCE, dataSource);
emf = Persistence.createEntityManagerFactory(persistUnit, additionalProperties);
原答案:
我有同样的问题,我只是想通过创建一个自定义的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)。
一些有用的链接:
关于:警告:databaseLogin.getPassword()已加密;
您可以使用以下内容:
Map<Object, Object> props = session.getProperties();
...
dataSource.setPassword((String) props.get("javax.persistence.jdbc.password"));
...
问候!!