首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HikariCP on AppEngine

HikariCP on AppEngine
EN

Stack Overflow用户
提问于 2018-12-17 09:46:35
回答 1查看 599关注 0票数 1

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

代码语言:javascript
复制
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的线程工厂,如下所示:

代码语言:javascript
复制
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;

它在我的本地应用程序引擎(DevServer)上工作,但是在部署时,我在数据源初始化时得到一个异常,因为appengine的自动标号模块不允许使用后台线程。

可以在AppEngine ?上使用HikariCP时保持“自动标度”的能力吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-17 16:46:56

Java 8运行时对线程没有像以前版本的App那样的限制。例如,此样本应用程序使用HikariCP连接到Cloud,并且不使用自定义线程管理器。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53812581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档