我可以在 Google App Engine 上使用 HikariCP
Can i use HikariCP on Google App Engine
在 App Engine 上寻找连接池解决方案,使用 Cloud SQL,多个条目显示 HikariCP 应该工作的建议,因为它允许外部 ThreadFactory 配置。例如;
- JDBC connection pool compatible with App Engine
- Connection pool on app engine with Cloud SQL
配置应该是这样的:
import com.google.appengine.api.ThreadManager;
...
HikariConfig lConfig = new HikariConfig();
config.setThreadFactory(ThreadManager.backgroundThreadFactory());
...
但是有问题;
事实上,由于 App Engine 的受限 "sandbox" 环境,快速尝试暴露了多个问题。
所以问题依然存在; 是否有人在 Google App Engine 上成功实施了 HikariCP?
是的,我已经在 Google App Engine 上实现了 HikariCP,但有一些注意事项;
Google App Engine 使用 three types and instance classes;
- 自动缩放
- 基本缩放
- 手动缩放
只有 Basic 和 Manual Scaling 类型允许后台线程,因此是与 HikariCP 一起使用的唯一候选者。
我使用了 Basic Scaling,这对于大致已知的用户群来说没有问题(例如,每个部署的实例对应一个公司)。这种类型启用了一些其他不错的功能,例如会话支持和强大的 B8 实例 (1024 MB / 4.8 GHz)。
对于我的大多数应用程序,我更喜欢一个强大的初始化实例而不是多个实例。
属性 threadFactory 仅可用 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 管理扩展。
在 App Engine 上寻找连接池解决方案,使用 Cloud SQL,多个条目显示 HikariCP 应该工作的建议,因为它允许外部 ThreadFactory 配置。例如;
- JDBC connection pool compatible with App Engine
- Connection pool on app engine with Cloud SQL
配置应该是这样的:
import com.google.appengine.api.ThreadManager;
...
HikariConfig lConfig = new HikariConfig();
config.setThreadFactory(ThreadManager.backgroundThreadFactory());
...
但是有问题;
事实上,由于 App Engine 的受限 "sandbox" 环境,快速尝试暴露了多个问题。
所以问题依然存在; 是否有人在 Google App Engine 上成功实施了 HikariCP?
是的,我已经在 Google App Engine 上实现了 HikariCP,但有一些注意事项;
Google App Engine 使用 three types and instance classes;
- 自动缩放
- 基本缩放
- 手动缩放
只有 Basic 和 Manual Scaling 类型允许后台线程,因此是与 HikariCP 一起使用的唯一候选者。 我使用了 Basic Scaling,这对于大致已知的用户群来说没有问题(例如,每个部署的实例对应一个公司)。这种类型启用了一些其他不错的功能,例如会话支持和强大的 B8 实例 (1024 MB / 4.8 GHz)。 对于我的大多数应用程序,我更喜欢一个强大的初始化实例而不是多个实例。
属性 threadFactory 仅可用 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 管理扩展。