Spring Boot如何接入金仓数据库并配置分层、启动自检与常见错误

 更新时间:2026年08月04日 10:33:38   作者:倔强的石头_  
在使用Spring Boot接入金仓数据库(KingbaseES,一种基于PostgreSQL的数据库系统)时,你需要进行一系列的配置工作,以确保系统可以正确运行、启动时进行自检,并处理可能出现的常见错误,以下是一些步骤和技巧,帮助你完成这些任务

JDBC 单文件程序适合验证链路,但真实业务系统大多是 Spring Boot 应用。Spring Boot 接入数据库看起来只是写几行 application.yml,但其实上线后出问题最多的也恰恰是这些配置:URL 写错、账号混用、连接池默认值不合适、环境配置串了、启动时没有做数据库自检。

本文基于 Windows 11 本地开发环境和 CentOS 7.6 数据库服务器,演示一个 Spring Boot 项目如何接入金仓数据库,并把配置拆分成可维护的方式。文中的 kb_appshopapp_usershop.t_connection_check 沿用第一篇创建好的对象。

一、实验目标

本文完成以下目标:

  • 在 Spring Boot 中配置金仓数据库连接。
  • 使用独立环境配置区分开发、测试、生产。
  • 增加启动自检,应用启动时确认数据库可用。
  • 梳理常见连接错误的排查顺序。

示例环境(表中 IP 仅为示例,使用时替换为自己的服务器地址):

Windows 11 本地开发机
    |
    | JDBC
    v
CentOS 7.6 数据库服务器:192.168.10.101:54321
数据库:kb_app
账号:app_user
Schema:shop

二、准备项目依赖

如果驱动已经进入企业内部 Maven 仓库,可以直接按内部坐标引入。还没有的话,可以先把驱动 jar 安装到本地仓库。本文沿用第一篇找到的 kingbase8-9.0.0.jar

mvn install:install-file `
  -Dfile=D:\Tools\Kingbase\KESV9R2C13\KES\KESRealPro\V009R002C013\Interface\jdbc\kingbase8-9.0.0.jar `
  -DgroupId=com.kingbase `
  -DartifactId=kingbase8 `
  -Dversion=9.0.0 `
  -Dpackaging=jar

pom.xml 中引入:

<dependency>
    <groupId>com.kingbase</groupId>
    <artifactId>kingbase8</artifactId>
    <version>9.0.0</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

如果你的项目使用 MyBatis、JPA 或其他数据访问框架,底层其实仍然离不开 DataSource 和 JDBC 连接,所以本文的配置思路依然适用。

三、基础连接配置

application-dev.yml 中配置开发环境连接:

spring:
  datasource:
    url: jdbc:kingbase8://192.168.10.101:54321/kb_app
    username: app_user
    password: App_user_123
    driver-class-name: com.kingbase8.Driver

几个注意点:

  • url 中的 IP 是 CentOS 7.6 数据库服务器地址。
  • 本文使用的 kingbase8-9.0.0.jar 驱动类为 com.kingbase8.Driver;如果后续换了驱动包,以实际驱动说明为准。
  • 不要在生产配置中明文写密码,后面要交给环境变量、配置中心或密钥管理工具。

启动时指定开发配置:

mvn spring-boot:run -Dspring-boot.run.profiles=dev

打包后运行:

java -jar kb-app-demo.jar --spring.profiles.active=dev

四、写一个最小查询接口

为了验证应用真的能访问数据库,可以写一个简单的 Repository:

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
@Repository
public class ConnectionCheckRepository {
    private final JdbcTemplate jdbcTemplate;
    public ConnectionCheckRepository(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    public String findCheckName(Integer id) {
        return jdbcTemplate.queryForObject(
                "select check_name from shop.t_connection_check where id = ?",
                String.class,
                id
        );
    }
}

再写一个 Controller:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ConnectionCheckController {
    private final ConnectionCheckRepository repository;
    public ConnectionCheckController(ConnectionCheckRepository repository) {
        this.repository = repository;
    }
    @GetMapping("/db/check")
    public String check(@RequestParam(defaultValue = "1") Integer id) {
        return repository.findCheckName(id);
    }
}

启动应用后访问:

http://localhost:8080/db/check?id=1

如果返回 jdbc_check_ready,说明 Spring Boot 已经通过 JDBC 访问到远端金仓数据库了。

五、增加启动自检

很多系统启动时只要端口起来了,就认为服务正常了。但其实如果数据库连接失败,应用即使启动成功,第一笔业务请求也会暴露问题。建议增加启动自检,把风险前置到启动阶段。

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Component;
@Component
public class DatabaseStartupChecker implements ApplicationRunner {
    private final JdbcTemplate jdbcTemplate;
    public DatabaseStartupChecker(JdbcTemplate jdbcTemplate) {
        this.jdbcTemplate = jdbcTemplate;
    }
    @Override
    public void run(ApplicationArguments args) {
        String result = jdbcTemplate.queryForObject(
                "select current_database() || ',' || current_user",
                String.class
        );
        System.out.println("database startup check: " + result);
    }
}

这个自检不需要复杂 SQL,只要能拿到当前数据库名和用户名就够了。生产环境中建议把输出交给日志框架,自检失败时让应用直接退出,不要带病启动。

六、按环境拆分配置

不要把所有环境的连接串堆在一个文件里。推荐这样拆:

application.yml
application-dev.yml
application-test.yml
application-prod.yml

application.yml 只保留公共配置:

spring:
  application:
    name: kb-app-demo

application-dev.yml

spring:
  datasource:
    url: jdbc:kingbase8://192.168.10.101:54321/kb_app
    username: app_user
    password: App_user_123

application-prod.yml

spring:
  datasource:
    url: ${KB_DB_URL}
    username: ${KB_DB_USER}
    password: ${KB_DB_PASSWORD}

生产运行时注入环境变量:

export KB_DB_URL='jdbc:kingbase8://10.10.20.15:54321/kb_app'
export KB_DB_USER='app_user'
export KB_DB_PASSWORD='你的生产密码'
java -jar kb-app-demo.jar --spring.profiles.active=prod

这样可以减少生产密码写入代码仓库的风险。

七、不要忽略默认 Schema 问题

很多应用在本地运行没问题,换环境后提示表不存在,实际原因往往仅仅是 SQL 没写 Schema。

推荐在 SQL 中明确写:

select * from shop.t_connection_check where id = ?

而不是:

select * from t_connection_check where id = ?

如果团队确实要依赖默认 Schema,必须在应用启动时做明确验证,避免不同环境行为不一致。

八、常见错误排查

1. Failed to configure a DataSource

检查是否引入了 JDBC 依赖,是否配置了 spring.datasource.url,是否指定了正确的 profile。

2. No suitable driver

检查 JDBC 驱动是否进入 classpath,连接串前缀是否与驱动匹配。

3. Connection refused

回到环境基线检查。重点看 CentOS 防火墙、数据库监听地址、端口、安全组。

4. FATAL 或认证失败

检查账号密码、目标数据库、访问控制规则。不要直接换高权限账号绕过。

5. SQL 运行时报表不存在

优先检查 Schema。应用 SQL 建议显式写 shop. 前缀。

九、上线前建议保留的日志

应用启动阶段至少输出以下信息:

  • 当前激活的 profile。
  • 数据库连接地址的脱敏信息。
  • 当前数据库名。
  • 当前连接用户。
  • 连接池最大连接数。
  • 启动自检是否通过。

密码绝不能打印到日志里。

十、小结

Spring Boot 接入金仓数据库,关键不只是把 URL 写进去,而是让配置可分层、连接可验证、问题可排查。开发环境先用 Windows 11 到 CentOS 7.6 的链路打通,生产环境再通过 profile、环境变量和启动自检把风险前置到启动阶段。

到此这篇关于Spring Boot 接入金仓数据库:配置分层、启动自检与常见错误的文章就介绍到这了,更多相关springboot接入金仓数据库内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java实现实时通信聊天程序

    java实现实时通信聊天程序

    这篇文章主要为大家详细介绍了java实现实时通信聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Java之不通过构造函数创建一个对象问题

    Java之不通过构造函数创建一个对象问题

    这篇文章主要介绍了Java之不通过构造函数创建一个对象问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • Spring Cloud  Eureka服务治理的实现

    Spring Cloud Eureka服务治理的实现

    服务治理是微服务框架中最为核心和基础的模块,它主要是用来实现各个微服务实例的自动化注册与发现。这篇文章主要介绍了Spring Cloud Eureka服务治理的实现,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 详解JUC并发编程中的进程与线程学习

    详解JUC并发编程中的进程与线程学习

    这篇文章主要为大家详细介绍了JUC并发编程中的进程与线程学习,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03
  • Java中CompletableFuture 的详细介绍

    Java中CompletableFuture 的详细介绍

    这篇文章主要介绍了Java中的CompletableFuture,通过创建 CompletableFuture 的对象的工厂方法展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-05-05
  • java并发锁的实现

    java并发锁的实现

    Java中的锁主要是为了解决多个线程访问共享数据时的竞争问题,确保线程能够安全地访问和修改共享数据,本文主要介绍了java并发锁的实现,感兴趣的可以了解一下
    2024-04-04
  • 基于params、@PathVariabl和@RequestParam的用法与区别说明

    基于params、@PathVariabl和@RequestParam的用法与区别说明

    这篇文章主要介绍了方法参数相关属性params、@PathVariabl和@RequestParam用法与区别,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 在springboot中实现个别bean懒加载的操作

    在springboot中实现个别bean懒加载的操作

    这篇文章主要介绍了在springboot中实现个别bean懒加载的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java线程通信中关于生产者与消费者案例分析

    Java线程通信中关于生产者与消费者案例分析

    这篇文章主要介绍了Java线程通信中关于生产者与消费者案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • java 如何往已经存在的excel表格里面追加数据的方法

    java 如何往已经存在的excel表格里面追加数据的方法

    这篇文章主要介绍了java 如何往已经存在的excel表格里面追加数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08

最新评论