Eclipselink Pooling相当于C3PO

问题描述 投票:1回答:2

我试图阻止这种日志记录

从服务器成功接收的最后一个数据包是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中做到这一点吗?

java jpa eclipselink connection-pooling c3p0
2个回答
2
投票

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)。

一些有用的链接:


0
投票

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

您可以使用以下内容:

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

问候!!

© www.soinside.com 2019 - 2024. All rights reserved.