2016-07-15 76 views
3

在App Engine上使用Cloud SQL尋找連接池解決方案時,多個條目顯示HikariCP應該可以工作,因爲它允許外部ThreadFactory配置。例如;我可以在Google App Engine上使用HikariCP

的配置是這樣的:

import com.google.appengine.api.ThreadManager; 

... 
HikariConfig lConfig = new HikariConfig(); 
config.setThreadFactory(ThreadManager.backgroundThreadFactory()); 
... 

但也有問題;

HikariCP on Google App Engine

果然,有一個快速的企圖暴露的諸多問題,由於App Engine的受限制的「沙箱」的環境。

所以問題依然存在; 是否有人在Google App Engine上成功實施HikariCP?

回答

3

是的,我在Google App Engine上實現了HikariCP,但有一些注意事項;

Google App Engine使用three types and instance classes;

  • 自動縮放
  • 基本變
  • 手動刻度

只有基本型和手動縮放允許後臺線程,因此與HikariCP使用的唯一候選人。 我已經使用Basic Sc​​aling,對於大致已知的用戶羣(例如每個部署實例有一個公司)沒有問題。這種類型支持一些其他很好的功能,如會話支持和功能強大的B8實例(1024 MB/4.8 GHz)。 對於我的大多數應用程序,我更喜歡在多個實例之上的一個強大的初始化實例。

屬性線程工廠只可用via programmatic configuration,所以我實現了我自己的連接提供程序;

public class MyConnectionProvider implements ConnectionProvider, Configurable, Stoppable 
{ 

... 

public void configure(Map props) throws HibernateException 
    { 
     try 
     { 
      mHikariConfig = HikariConfigurationUtil.loadConfiguration(props); 

      if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) 
      { 
       mHikariConfig.setDriverClassName("com.mysql.jdbc.GoogleDriver"); 
       mHikariConfig.setJdbcUrl("jdbc:google:mysql://project-xxx:database/xxx"); 
       mHikariConfig.setThreadFactory(ThreadManager.backgroundThreadFactory()); 
      } 
      else 
      { 
       mHikariConfig.setDriverClassName("com.mysql.jdbc.Driver"); 
       mHikariConfig.setJdbcUrl("jdbc:mysql://localhost:3306/xxx"); 
      } 

      mHikariConfig.addDataSourceProperty("databaseName", "xxx"); 
      mHikariConfig.setUsername("USERNAME"); 
      mHikariConfig.setPassword("PASSWD"); 
      mHikariConfig.setRegisterMbeans(false); 

      mHikariConfig.setMaximumPoolSize(12); 
      mHikariConfig.addDataSourceProperty("cachePrepStmts", "true"); 
      mHikariConfig.addDataSourceProperty("useServerPrepStmts", "true"); 
      mHikariConfig.addDataSourceProperty("prepStmtCacheSize", "250"); 
      mHikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); 

      mHikariDataSource = new HikariDataSource(mHikariConfig); 
     } 
     catch (Exception e) 
     { 
      throw new HibernateException(e); 
     } 
    } 

... 

} 

數據庫名稱已經在JdbcUrl中,但我不得不再次指定它。 另一個重要配置設置是

mHikariConfig.setRegisterMbeans(false); 

此禁用在App Engine上的限制Java管理擴展。

相關問題