【问题标题】:HikariCP on AppEngineAppEngine 上的 HikariCP
【发布时间】:2018-12-17 09:46:35
【问题描述】:

在使用 HikariCP 作为 Appengine 上的连接池部署 Spring Boot 应用程序时,在执行一些请求时,我遇到了一些与数据库(线程)相关的错误:

Caused by: java.sql.SQLNonTransientConnectionException: Could not create connection to database server.
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
    at com.mysql.cj.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:1008)
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:825)
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:455)
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:240)
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:207)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:136)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:369)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:198)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:467)
    at com.zaxxer.hikari.pool.HikariPool.access$100(HikariPool.java:71)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:706)
    at com.zaxxer.hikari.pool.HikariPool$PoolEntryCreator.call(HikariPool.java:692)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    ... 1 more
Caused by: com.google.apphosting.api.ApiProxy$CallNotFoundException: Can't make API call memcache.Get in a thread that is neither the original request thread nor a thread created by ThreadManager

然后我发现 AppEngine 只允许应用程序使用它的 ThreadFactory 创建线程。所以我确保将我的 Hikari 配置为使用 AppEngine 的线程工厂,如下所示:

DataSource ds = new HikariDataSource();
try {
    final HikariConfig dataSourceConfig = new HikariConfig();
    dataSourceConfig.setDriverClassName(applicationProperties.getDatasource()
                                                            .getDriverClassName());
    dataSourceConfig.setJdbcUrl(applicationProperties.getDatasource()
                                                    .getUrl());
    dataSourceConfig.setUsername(applicationProperties.getDatasource()
                                                    .getUsername());
    dataSourceConfig.setPassword(applicationProperties.getDatasource()
                                                    .getPassword());

    dataSourceConfig.setRegisterMbeans(false);
    if (Objects.equal(ProfileResolver.getActiveCloudPlatform(env), ProfileConstants.SPRING_PROFILE_GCP)) {
        log.info("[GCP] Set 'com.google.appengine.api.ThreadManager.backgroundThreadFactory()' "
                    + "as the instance of the java.util.concurrent.ThreadFactory");
        dataSourceConfig.setThreadFactory(ThreadManager.backgroundThreadFactory());
    }
    ds = new HikariDataSource(dataSourceConfig);
} catch (final Exception e) {
    throw new IllegalStateException(e);
}
return ds;

它适用于我的本地 appengine (DevServer),但在部署时我在数据源初始化时遇到异常,因为 Appengine 的自动缩放模块不允许使用后台线程。

在 AppEngine 上使用 HikariCP 时是否可以保持“自动缩放”功能?

【问题讨论】:

    标签: java spring-boot google-app-engine hikaricp


    【解决方案1】:

    Java 8 运行时在线程方面没有与以前版本的 App Engine 相同的限制。例如,这个sample app 使用 HikariCP 连接到 Cloud SQL,并且在没有自定义线程管理器的情况下工作。

    【讨论】:

    • 感谢您的回答。我记得起初使用 hikari 及其默认配置,但我遇到了问题,我在我的问题中指定,一旦我开始收到很多请求。我的意思是 Hikari 使用后台线程,而 Appengine 在线程方面(在自动缩放模式下)在其执行环境中仍然有一些限制?
    • 您使用的是 Java 7 还是 Java 8 运行时?
    • 我正在使用 java 8
    • 根据文档,Java 8 运行时允许后台线程(我没有看到任何表明自动缩放问题):cloud.google.com/appengine/docs/standard/java/runtime#threads
    • 所以我们同意 HikariCP 应该为其 ThreadFactory 使用 ThreadManager API?在此文档cloud.google.com/appengine/docs/standard/java/… 中,您会看到自动缩放中不允许使用后台线程。
    猜你喜欢
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2017-11-09
    • 2017-11-29
    • 2016-06-20
    • 2014-09-11
    • 2011-08-26
    • 2011-07-18
    相关资源
    最近更新 更多