You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ktor项目连接PostgreSQL报错:Driver不接受jdbcUrl问题排查

问题排查:Ktor连接PostgreSQL时的JDBC URL错误

问题描述

连接PostgreSQL时抛出错误:
Driver org.postgresql.Driver claims to not accept jdbcUrl, jdbc.postgresql:notes_db?user=postgres&password=<masked>

项目代码(DatabaseFactory.kt)

object DatabaseFactory {

    fun init() {
        Database.connect(hikari())

        transaction {
            SchemaUtils.create(UserTable)
        }
    }

    fun hikari(): HikariDataSource {
        val config = HikariConfig()
        config.driverClassName = System.getenv("JDBC_DRIVER") // 1
        config.jdbcUrl = System.getenv("DATABASE_URL") // 2
        config.maximumPoolSize = 3
        config.isAutoCommit = false
        config.transactionIsolation = "TRANSACTION_REPEATABLE_READ"
        config.validate()

        return HikariDataSource(config)
    }

    suspend fun <T> dbQuery(block: () -> T): T =
        withContext(Dispatchers.IO) {
            transaction { block() }
        }
}

环境变量配置(来自截图)

  • JDBC_DRIVER=org.postgresql.Driver
  • DATABASE_URL=jdbc.postgresql:notes_db?user=postgres&password=xxx

解决方案

1. 修正JDBC URL格式(核心问题)

PostgreSQL的JDBC URL必须遵循标准格式:
jdbc:postgresql://[主机地址]:[端口]/[数据库名]?[参数]

你的URL错误地用点号代替了冒号(jdbc.postgresql:),正确写法示例:

  • 本地默认端口(5432)连接:jdbc:postgresql://localhost:5432/notes_db?user=postgres&password=xxx
  • 省略默认主机和端口:jdbc:postgresql:///notes_db?user=postgres&password=xxx

2. 验证驱动依赖

确保项目依赖中已正确引入PostgreSQL及相关组件,以build.gradle.kts为例:

dependencies {
    implementation("org.postgresql:postgresql:42.7.3") // 用最新稳定版
    implementation("com.zaxxer:HikariCP:5.0.1")
    implementation("org.jetbrains.exposed:exposed-core:0.48.0")
    implementation("org.jetbrains.exposed:exposed-jdbc:0.48.0")
}

3. 可选:分离用户名密码配置

HikariCP支持单独配置账号密码,无需嵌入URL,更安全:

fun hikari(): HikariDataSource {
    val config = HikariConfig()
    config.driverClassName = System.getenv("JDBC_DRIVER")
    config.jdbcUrl = System.getenv("DATABASE_URL") // 此时URL仅保留地址:jdbc:postgresql://localhost:5432/notes_db
    config.username = System.getenv("DB_USER")
    config.password = System.getenv("DB_PASSWORD")
    // 其他原有配置
    config.validate()
    return HikariDataSource(config)
}

内容的提问来源于stack exchange,提问作者BRDroid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:58:29