2014-10-25 3 views
4

최대 절전 모드를 GAE 및 Cloud SQL과 함께 사용하고 있습니다.클라우드 SQL 용 Hibernate 연결 풀 공급자

모든 것이 잘 작동하지만 인스턴스가 최대 깨울 때, 때때로 나는 대부분의 시간은 최대 절전 모드가 수립되는 것을 볼 로그에서 (15 초까지) 데이터베이스에 연결하는 데 시간이 오래

소요 연결 : 여기에

I 17:46:35.936 org.hibernate.cfg.Configuration doConfigure: HHH000041: Configured SessionFactory: null 
    W 17:46:36.209 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000402: Using Hibernate built-in connection pool (not for production use!) 
    I 17:46:36.243 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000115: Hibernate connection pool size: 0 
    I 17:46:36.244 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000006: Autocommit mode: false 
    I 17:46:36.244 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000401: using driver [com.mysql.jdbc.GoogleDriver] at URL [jdbc:google:mysql://database?user=someUser] 
    I 17:46:36.245 org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure: HHH000046: Connection properties: {} 
    I 17:46:45.356 org.hibernate.dialect.Dialect <init>: HHH000400: Using dialect: org.hibernate.dialect.MySQL5InnoDBDialect 

코드이 생산된다

properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.GoogleDriver"); 
properties.put("hibernate.connection.url", "jdbc:google:mysql://" + SQL_INSTANCE + "/" + DATABASE + "?user=someUser"); 

// disable schema check 
properties.put("hibernate.hbm2ddl.auto", ""); // disable 
properties.put("hibernate.show_sql", false);    

// single session per request/thread 
properties.put("hibernate.connection.pool_size", 0); 
properties.put("hibernate.current_session_context_class", "thread"); 

Configuration cfg = new Configuration(); 
cfg.configure("/META-INF/hibernate.cfg.xml"); 
cfg.addProperties(properties); 

sessionFactory = cfg.buildSessionFactory(new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry()); 

다음 방법은 세션을 제공

public Session getSession() { 

     Session session; 
     try { 
      session = sessionFactory.getCurrentSession(); 
     } 
     catch (org.hibernate.HibernateException he) { 
      log.info("Opening new hibernate session."); 
      session = sessionFactory.openSession(); 
     } 

     return session; 
    } 

연결 풀 크기를 0으로 설정하고 있지만 연결 풀 관리자에서 Hibernates 빌드가 사용 된 것 같습니다.

내 질문은이 설정에서 어떤 연결 풀 관리자를 사용해야하며 연결 ​​시간을 단축하기 위해 수행 할 수있는 다른 작업이 무엇인지 궁금합니다.

몇 가지 간단한 예제를 찾을 수 없으므로 이러한 종류의 설치에 대한 모범 사례는 무엇입니까?

답변

1

probably the fastest open-source CPHikariCP을 사용하는 것이 좋습니다.

나는 당신이 복제하고 Hibernate 로컬 트랜잭션 설정에 대한 나의 구성을 점검 할 수있는 GitHub 프로젝트를 가지고있다. 이 예제에서는 DBCP를 사용하지만 데이터 소스 구성을 HikariDataSource one으로 바꾸면됩니다.

당신은 API와 돈을 최대 절전 모드만을 사용하는 경우, 당신은 당신의 HikariDataSource 객체를 생성 한 후 다음, 당신이 구성에 최대 절전 모드로 보내야, t 봄에 의존 할 :

@Override 
protected SessionFactory newSessionFactory() { 
    Properties properties = new Properties(); 
    ... 
    //data source settings 
    properties.put("hibernate.connection.datasource", hikariDataSource); 
    return new Configuration() 
    .addProperties(properties) 
    .addAnnotatedClass(SecurityId.class) 
    .buildSessionFactory(
      new StandardServiceRegistryBuilder() 
      .applySettings(properties) 
    .build() 
); 
+0

시작 시간을 비교하고 비교해 보면 ... 트릭을 수행 할 수 있습니다. – Drejc

+0

슬프게도 GAE와 함께 작동시키지 못했습니다. localhost에서는 작동하지만 프로덕션 환경에서는 작동하지 않습니다. 그래서이 오픈 소스 연결 풀 공급자를 사용하고 있습니다 : https://hibernate-gae.googlecode.com/svn/trunk/hibernate-gae-connection-pool/src/fi/foyt/hibernate/gae/connection/GAEConnectionProvider.java – Drejc

+0

기본 연결 풀링 구현처럼 보이지만 다른 외부 풀이 누락 될 수있는 특정 GAE 연결 검색 옵션을 사용할 수 있습니다. –

0

ON_DEMAND SQL 인스턴스를합니다 유휴 기간 후 종료 인스턴스가 종료되면 새 연결은 연결이 완료되기 전에 인스턴스가 시작될 때까지 대기해야합니다.

발생 가능한 지연 일 수 있습니다. 정품 인증 정책을 항상로 변경하고 연결 오버 헤드를 줄이는 지 확인할 수 있습니다. 이 작업을 수행하는 경우 인스턴스가 지속적으로 실행되는 경우 비용이 저렴하므로 요금 청구 계획을 "패키지"로 변경해야합니다.

이 내용은 Cloud SQL FAQ에 있습니다.

+0

까지 로그에서 볼 수 있습니다 .. 시간의 주요 부분은 연결을 설정하는 데 사용됩니다. 이것은 새로운 인스턴스가 시작될 때 모든 예열 요청에서 발생합니다. 이것은 미션 크리티컬 한 앱이 아니므로 인스턴스를 시작하고 실행하는 것이 과잉입니다.내부 hybernate 연결 풀 관리자가 지연을 일으키고 있다고 의심 스럽지만 (실제 규모 구현이 아니거나 GAE 스타일로 사용되기 때문에) 의심 스럽습니다. 내가 시도하고 설정을 변경, 어떻게되는지 보게됩니다. – Drejc