我可以在Google App Engine上使用HikariCP吗?

在App Engine上寻找连接池解决方案,使用Cloud SQL,多个条目显示HikariCP应该工作的建议,因为它允许外部ThreadFactory配置。 例如;

  • JDBC连接池与App Engine兼容
  • 使用Cloud SQL的应用引擎上的连接池

配置将是这样的:

import com.google.appengine.api.ThreadManager; ... HikariConfig lConfig = new HikariConfig(); config.setThreadFactory(ThreadManager.backgroundThreadFactory()); ... 

但是有问题;

Google App Engine上的HikariCP

实际上,由于App Engine受限制的“沙盒”环境,快速尝试暴露了多个问题。

所以问题仍然存在; 有人在Google App Engine上成功实施了HikariCP吗?

是的,我已经在Google App Engine上实施了HikariCP,但有一些注意事项;

Google App Engine使用三种类型和实例类 ;

  • 自动缩放
  • 基本缩放
  • 手动缩放

只有基本和手动缩放类型允许后台线程,因此是与HikariCP一起使用的唯一候选者。 我已经使用了Basic Sc​​aling,这对于大致已知的用户群来说没有问题(例如,每个已部署的实例都有一个公司)。 此类型还支持其他一些不错的function,如会话支持和function强大的B8实例(1024 MB / 4.8 GHz)。 对于我的大多数应用程序,我更喜欢多个实例上面的一个强大的初始化实

属性threadFactory只能通过编程配置获得 ,所以我实现了自己的连接提供程序;

 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管理扩展。