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

Rol*_*ker 3 java google-app-engine google-cloud-sql hikaricp

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

配置将是这样的:

import com.google.appengine.api.ThreadManager;

...
HikariConfig lConfig = new HikariConfig();
config.setThreadFactory(ThreadManager.backgroundThreadFactory());
...
Run Code Online (Sandbox Code Playgroud)

但是有问题;

Google App Engine上的HikariCP

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

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

Rol*_*ker 6

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

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

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

只有基本和手动缩放类型允许后台线程,因此是与HikariCP一起使用的唯一候选者.我已经使用了Basic Sc​​aling,这对于大致已知的用户群来说没有问题(例如,每个已部署的实例都有一家公司).此类型还支持其他一些不错的功能,如会话支持和功能强大的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);
        }
    }

...

}
Run Code Online (Sandbox Code Playgroud)

数据库名称已经在JdbcUrl中,但我必须再次指定它.另一个重要的配置设置是

mHikariConfig.setRegisterMbeans(false);
Run Code Online (Sandbox Code Playgroud)

这将禁用App Engine的受限Java管理扩展.