2016-07-15 83 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管理扩展。

相关问题