1

このロギングを防止しようとしています

サーバーから正常に受信された最後のパケットは、10,255 ミリ秒前でした。サーバーに正常に送信された最後のパケットは 0 ミリ秒前です。

私はすでにpersistence.xmlで自動再接続を使用して接続URLを設定しています

私が望むのは、接続プールが存在することです。接続が存続するように、1 分または 1 時間ごとに接続をチェックします。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でこれを行うことができる方法はありますか?

4

2 に答える 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;
  }
}

eclipselink で c3p0 を使用する場合は、おそらくこのページ ( http://www.mchange.com/projects/c3p0/#using_combopooleddatasource ) に記載されているコードを buildDataSource メソッドで使用するだけで済みます。

いくつかの便利なリンク:

于 2014-05-18T10:40:41.217 に答える