【问题标题】:Issues with testing Cloud SQL locally using App Engine使用 App Engine 在本地测试 Cloud SQL 的问题
【发布时间】:2019-09-01 17:09:57
【问题描述】:

我一直在尝试使用本地 App Engine 中的 HikariCP 连接到 Cloud SQL 实例,以便进行查询。每次我使用 ./gradlew appengineRun 命令运行 App Engine 时,都会收到 java.net.SocketException: already connected 错误。当我将它部署到 App Engine 时,这可以正常工作,但在本地它将无法正常工作。我被难住了。

Hikari 的配置如下:

val config = HikariConfig().apply {
    jdbcUrl = "jdbc:postgresql://google/[DB-NAME]"
    username = "[USERNAME]"
    password = "[PASSWORD]"
    addDataSourceProperty("cloudSqlInstance", "[INSTANCE-CONNECTION-NAME")
    addDataSourceProperty("socketFactory", "com.google.cloud.sql.postgres.SocketFactory")
}

private val dataSource = HikariDataSource(config)

private val connection = dataSource.connection

然后执行查询:

connection.use { connection ->
    connection.prepareCall("SELECT EXISTS(SELECT 1 FROM profiles WHERE username = '$username')").use { statement ->
        statement.executeQuery().use { resultSet ->
            try {
                val exists = generateSequence {
                    if (resultSet.next()) resultSet.getBoolean(1) else null
                }.toList()
                onComplete(exists.any { it }, null)
            } catch (e: Exception) {
                onComplete(false, e)
            }
        }
    }
}

我确定这是连接到 SQL 的正确配置,但我不断收到此堆栈跟踪:

Caused by: com.zaxxer.hikari.pool.HikariPool$PoolInitializationException: Failed to initialize pool: The connection attempt failed.
    at com.zaxxer.hikari.pool.HikariPool.throwPoolInitializationException(HikariPool.java:597)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:576)
    at com.zaxxer.hikari.pool.HikariPool.<init>(HikariPool.java:115)
    at com.zaxxer.hikari.HikariDataSource.<init>(HikariDataSource.java:81)
    at appengine.sql.repository.ProfileRepository.<clinit>(ProfileRepository.kt:34)
    ... 48 more
Caused by: org.postgresql.util.PSQLException: The connection attempt failed.
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:262)
    at org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:67)
    at org.postgresql.jdbc.PgConnection.<init>(PgConnection.java:216)
    at org.postgresql.Driver.makeConnection(Driver.java:406)
    at org.postgresql.Driver.connect(Driver.java:274)
    at com.zaxxer.hikari.util.DriverDataSource.getConnection(DriverDataSource.java:138)
    at com.zaxxer.hikari.pool.PoolBase.newConnection(PoolBase.java:353)
    at com.zaxxer.hikari.pool.PoolBase.newPoolEntry(PoolBase.java:201)
    at com.zaxxer.hikari.pool.HikariPool.createPoolEntry(HikariPool.java:473)
    at com.zaxxer.hikari.pool.HikariPool.checkFailFast(HikariPool.java:562)
    ... 51 more
Caused by: java.net.SocketException: already connected
    at java.net.Socket.connect(Socket.java:569)
    at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)
    at org.postgresql.core.PGStream.<init>(PGStream.java:64)
    at org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:133)
    ... 60 more

【问题讨论】:

  • 我尝试在本地运行您的代码,它对我来说很好。库是:implementation("com.zaxxer:HikariCP:3.3.1") implementation("org.postgresql:postgresql:42.2.6") implementation("com.google.cloud.sql:postgres-socket-factory:1.0.14") 也许你有一些以前运行的后台进程?你试过重启系统吗?
  • @RinatSuleimanov 是的,我尝试重新启动,但我猜后台进程仍处于打开状态。我如何从 IntelliJ 中检查?
  • 如果重启没有帮助,我相信其他地方的问题。您可以使用外部 IP 直接连接到数据库吗?或者,我猜,您的代码试图多次创建连接对象?你能分享一下整个代码示例吗?

标签: google-app-engine kotlin google-cloud-platform google-cloud-sql


【解决方案1】:

使用后连接是否正确关闭?应用程序是否有可能在 SQL 实例关闭连接后尝试重用连接?我建议在应用程序中实现一个连接池,以便有效地使用与数据库的连接。一些 CloudSQL 文档页面可能有助于涵盖这些主题 [1][2]。

[1]https://cloud.google.com/sql/docs/mysql/manage-connections#opening_and_closing_connections

[2]https://cloud.google.com/sql/docs/mysql/diagnose-issues

【讨论】:

  • 原来如此,Hikari 是一个连接池。我在初始化 HikariDataSource 时收到此错误。
  • 您是否尝试过按照此链接中的教程进行操作? dzone.com/articles/…
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 2014-02-06
  • 1970-01-01
  • 2021-07-07
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多