我们当前在Ktor服务中使用jasync-sql PostgreSQL异步库,并且得到:
14:02:20.005 [DefaultDispatcher-worker-1] ERROR com.github.jasync.sql.db.postgresql.PostgreSQLConnection - Can't run query because there is one query pending already
14:02:20.008 [nettyCallPool-4-1] ERROR Application - Unhandled: GET - /api/customer_book_list
com.github.jasync.sql.db.exceptions.ConnectionStillRunningQueryException: <1> - There is a query still being run here - race -> false
at com.github.jasync.sql.db.postgresql.PostgreSQLConnection.notReadyForQueryError(PostgreSQLConnection.kt:297)
at com.github.jasync.sql.db.postgresql.PostgreSQLConnection.validateIfItIsReadyForQuery(PostgreSQLConnection.kt:305)
at com.github.jasync.sql.db.postgresql.PostgreSQLConnection.validateQuery(PostgreSQLConnection.kt:312)
at com.github.jasync.sql.db.postgresql.PostgreSQLConnection.sendPreparedStatement(PostgreSQLConnection.kt:133)
at util.PostgresClient$sendPreparedStatement$2.doResume(PostgresClient.kt:19)
at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:42)
at kotlinx.coroutines.experimental.DispatchedTask$DefaultImpls.run(Dispatched.kt:168)
at kotlinx.coroutines.experimental.DispatchedContinuation.run(Dispatched.kt:13)
at kotlinx.coroutines.experimental.scheduling.Task.run(Tasks.kt:94)
at kotlinx.coroutines.experimental.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:567)
at kotlinx.coroutines.experimental.scheduling.CoroutineScheduler.access$runSafely(CoroutineScheduler.kt:60)
at kotlinx.coroutines.experimental.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:713)
我们是否必须为每个请求打开连接?还是配置错误?
答案 0 :(得分:0)
在jasync-sql中,每个Connection
一次只能处理一个语句执行。对于多个连接,最好的方法是使用像这样的ConnectionPool
:
PoolConfiguration poolConfiguration = new PoolConfiguration(
100, // maxObjects
TimeUnit.MINUTES.toMillis(15), // maxIdle
10_000, // maxQueueSize
TimeUnit.SECONDS.toMillis(30) // validationInterval
);
Connection connectionPool = new ConnectionPool<>(
new PostgreSQLConnectionFactory (configuration), poolConfiguration);
Connection
本身没有待处理请求的缓冲区或队列,因此,除非您要为每个请求创建效率低的连接,否则应使用连接池。
可在此处找到完整的Kotlin示例:https://github.com/jasync-sql/jasync-sql/blob/master/samples/ktor/src/application.kt