当前位置: 首页 > 知识库问答 >
问题:

AppEngine上的HikariCP

欧照
2023-03-14

在Appengine上使用HikariCP作为连接池部署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;

共有1个答案

督冠玉
2023-03-14

Java8运行时不像以前版本的App Engine那样对线程有相同的限制。例如,这个示例应用程序使用HikariCP连接到Cloud SQL,并且在没有自定义线程管理器的情况下工作。

 类似资料:
  • 我试图在本地appengine模拟器上运行我的代码,但我仍然得到错误信息,即ServletInitializer类不是javax.servlet.servlet有启动时的日志 我已经创建了ServletInitializer类,类似于教程和示例项目https://github.com/googleCloudplatform/get-started-java/blob/master/appengin

  • 正如通常发生的那样,客户更改了他们的G Suite电子邮件密码,我们使用该密码发送电子邮件(在Java@AppEngine上)。令牌如预期的那样被撤销了,并且我们设法使所有的东西都能在DEV和UAT环境中正常工作,然而PROD由于某种原因仍然得到了臭名昭著的“无效授权”。我想知道数据存储中是否有一些缓存保存原始凭据?Stackdriver不允许对方法调用求值,因此无法看到里面的内容。我们怀疑这与缓

  • 问题内容: 我正在部署在端口8761上运行的Java应用程序,并且在localhost上运行良好。 虽然当我推送到App Engine灵活环境时,会收到HTTP 502服务器错误。 这是我的: 来自gcloud的日志很好,服务器正在运行,但是我的请求似乎根本没有触及该应用程序。 我注意到,如果我在端口8080上运行,它将起作用。现在,将默认端口更改为8080是没有问题的,但是我想了解为什么我不能在

  • 我的Windows Vista笔记本电脑正在消亡,所以我购买了一台运行Windows 7 Pro 64 Bit的新HP笔记本电脑。 然后我下载并安装了python-2.7.8.amd64.msi.随后是GoogleAppEngine-1.9.9。 将我的Google App Application从Vista笔记本电脑复制到Win7并尝试运行它。问题是,通常情况下Chrome只是显示一个空白页面,

  • 问题内容: 当我尝试在AppEngine中使用低级DataStore API时,我得到了一个有趣的东西。此异常发生在云服务器中,而不是在本地实例中。我在本地使用。 问题答案: 听起来对我来说是两件事之一。 1:您正在尝试在单元测试中运行GAE代码,在这种情况下,您需要使用此页面中指定的代码。 2:您没有将所有必需的jar添加到类路径中。

  • 我目前正在从事一个Android AppEngine项目,使用语音作为主要输入方法。在android上,您可以使用语音包将语音命令转换为纯文本。语音识别不是在设备本身上完成的,而是发送到一个谷歌服务器,该服务器返回文本。 供您参考:http://developer.android.com/resources/articles/speech-input.html 我的目标是使用相同的google服务