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

基于Kotlin/Gradle/Spring/JOOQ的应用JOOQ数据库连接失败排查

问题

我正在搭建一个基于Kotlin/Gradle/Spring/JOOQ的应用,仅包含基础的BackendApplication.kts文件(仅调用runApplication<BackendApplication>(*args)),运行时出现数据库连接错误。

我的build.gradle.kts配置如下:

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import org.jooq.meta.jaxb.ForcedType
import org.jooq.meta.jaxb.Logging
import org.jooq.meta.jaxb.Property

plugins {
    id("org.springframework.boot") version "3.2.2"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.22"
    kotlin("plugin.spring") version "1.9.22"
    id("nu.studer.jooq") version "9.0"
}

group = "com.example"
version = "0.0.1-SNAPSHOT"

java {
    sourceCompatibility = JavaVersion.VERSION_17
}

configurations {
    compileOnly {
        extendsFrom(configurations.annotationProcessor.get())
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-jooq")
    implementation("org.springframework.boot:spring-boot-starter-web")
    implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
    implementation("org.jetbrains.kotlin:kotlin-reflect")
    compileOnly("org.projectlombok:lombok")
    runtimeOnly("org.postgresql:postgresql")
    annotationProcessor("org.projectlombok:lombok")
    testImplementation("org.springframework.boot:spring-boot-starter-test")
    implementation("org.jooq:jooq:3.19.3")
    jooqGenerator("org.postgresql:postgresql:42.7.1")
}

tasks.withType<KotlinCompile> {
    kotlinOptions {
        freeCompilerArgs += "-Xjsr305=strict"
        jvmTarget = "17"
    }
}

tasks.withType<Test> {
    useJUnitPlatform()
}

jooq {
   configurations {
      create("main") {
    generateSchemaSourceOnCompilation.set(true)
    jooqConfiguration.apply {
       logging = Logging.WARN
       jdbc.apply {
        driver = "org.postgresql.Driver"
        url = "censored"
            user = "censored"
        password = "censored"
        properties.add(Property().apply {
           key = "ssl"
           value = "true"
        })
       }
       generator.apply {
        name = "org.jooq.codegen.DefaultGenerator"
        database.apply {
           name = "org.jooq.meta.postgres.PostgresDatabase"
           inputSchema = "public"
           forcedTypes.addAll(listOf(
            ForcedType().apply {
               name = "varchar"
               includeExpression = ".*"
               includeTypes = "JSONB?"
            },
            ForcedType().apply {
               name = "varchar"
               includeExpression = ".*"
               includeTypes = "INET"
            }
           ))
            }
        generate.apply {
           isDeprecated = false
           isRecords = true
           isImmutablePojos = true
           isFluentSetters = true
        }
        target.apply {
           packageName = "com.example.Server.domain"
           directory = "build/generated-src/jooq/main"
            }
        strategy.name = "org.jooq.codegen.DefaultGeneratorStrategy"
         }
      }
      }
   }
}

运行应用时收到如下错误:

17:30:21 SEVERE Error in file: /Users/myName/Desktop/name/Code/Backend/build/tmp/generateJooq/config.xml. Error : Cannot connect to database using JDBC URL: CENSORED_URL Please review your JDBC configuration in the code generator configuration.
java.sql.SQLException: Cannot connect to database using JDBC URL: CENSORED_URL. Please review your JDBC configuration in the code generator configuration.
    at org.jooq.codegen.GenerationTool.run0(GenerationTool.java:366)
    at org.jooq.codegen.GenerationTool.run(GenerationTool.java:246)
    at org.jooq.codegen.GenerationTool.generate(GenerationTool.java:241)
    at org.jooq.codegen.GenerationTool.main(GenerationTool.java:213)

注:CENSORED_URL为我的实际数据库URL。我能通过PgAdmin正常连接Postgres数据库并看到User表,JOOQ配置的数据库凭证与PgAdmin使用的完全一致,但JOOQ仍无法连接数据库,请问问题出在哪里?

可能的解决方案
  • 检查JDBC URL格式与参数:PostgreSQL JDBC URL标准格式为jdbc:postgresql://host:port/database,确认是否遗漏数据库名称、host/port是否正确。若需SSL连接,尝试将参数改为sslmode=require而非仅ssl=true,部分PostgreSQL版本对SSL参数要求更严格。
  • 统一PostgreSQL驱动版本:当前配置中jooqGenerator使用的PostgreSQL驱动版本为42.7.1,而runtimeOnly依赖的版本由Spring Boot管理,尝试将两者版本统一,避免版本差异导致的连接兼容问题。
  • 验证Gradle进程的网络权限:PgAdmin能连接不代表Gradle进程拥有相同网络权限,检查本地防火墙是否拦截Gradle出站请求,或远程数据库白名单是否包含Gradle进程的IP。可以编写简单的JDBC测试代码验证连接:
    import java.sql.Connection;
    import java.sql.DriverManager;
    
    public class TestDBConnection {
        public static void main(String[] args) {
            try {
                Class.forName("org.postgresql.Driver");
                String url = "你的实际数据库URL";
                String user = "你的数据库用户名";
                String password = "你的数据库密码";
                Connection conn = DriverManager.getConnection(url, user, password);
                System.out.println("数据库连接成功");
                conn.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    编译运行该类,确认基础JDBC连接是否可行,缩小问题范围。
  • 检查生成的JOOQ配置文件:打开错误提示中的build/tmp/generateJooq/config.xml,确认文件内的JDBC配置是否与build.gradle.kts中的配置一致,注意密码等字段是否存在特殊字符未转义的情况。
  • 查看PostgreSQL服务器日志:登录数据库服务器,查看PostgreSQL的日志文件,里面会记录连接失败的具体原因(如认证失败、SSL握手错误等),能提供比JOOQ更详细的调试信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:09:58