Can i use HikariCP on Google App Engine

3

在App Engine中寻找与Cloud SQL兼容的连接池解决方案时,有多个条目建议使用HikariCP,因为它允许外部ThreadFactory配置。例如;

配置如下:

import com.google.appengine.api.ThreadManager;

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

但是存在问题; 在Google App Engine上使用HikariCP 实际上,快速尝试暴露了多个问题,这是由于App Engine的受限"沙盒"环境引起的。
因此问题仍然存在; 是否有人成功地在Google App Engine上实现了HikariCP?
1个回答

6

我已经在Google App Engine上实现了HikariCP,但需要考虑以下几点:

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

  • 自动扩展
  • 基本扩展
  • 手动扩展

只有基本和手动扩展类型允许使用后台线程,因此它们是可以与HikariCP一起使用的唯一选项。我使用的是基本扩展,这对于已知用户数量的应用程序(例如每个部署实例对应一个公司)没有问题。这种类型还启用了其他一些很好的功能,比如会话支持和强大的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管理扩展。


之后,您如何使用此ConnectionProvider而不是HikariConnectionProvider? 您能给我完整的相关代码吗? - faithonour
1
只需在您的persistence.xml配置中指定它(<property name="hibernate.connection.provider_class" value="com.xxx.server.hibernate.MyConnectionProvider"/>)。 - Roland Beuker
我正在使用Springboot 2.0,如何应用它?因为找不到persistance.xml。 - faithonour
实际上,如果我不使用ThreadManager(保留默认设置),它也能工作。但是在30分钟后(随机),它会出错。因此,我不知道为什么会出错。是因为ThreadManager还是其他原因。 - faithonour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接