2013-07-24 2 views
1

Я пытаюсь предотвратить журналированияEclipseLink Pooling эквивалентно C3PO

последний пакет успешно получил от сервера был 10,255 миллисекунды назад. Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад.

Я уже установить URL-соединение с автоматическим переподключение в persistence.xml

То, что я хочу, что там будет пул соединений, проверьте соединение каждую минуту или час, так что соединение все еще жив. 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?

ответ

2

Update 18 ноября 2014:

Я нашел ответ я предоставил первоначально есть некоторые проблемы! Полученный пароль зашифровывается 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

Оригинал Ответ:

У меня такая же проблема, и я просто понял, что я мог бы использовать bonecp источник данных (C3P0 должен быть похожим) с eclipselink, создавая пользовательский SessionCustomizer. Что-то вроде этого:

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, возможно, вам просто нужно использовать код, указанный на этой странице (http://www.mchange.com/projects/c3p0/#using_combopooleddatasource) в методе buildDataSource.

Некоторые полезные ссылки:

0

относительно: ПРЕДУПРЕЖДЕНИЕ: databaseLogin .getPassword() зашифрован;

Вы можете использовать следующее:

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

привет !!