【发布时间】: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