【Kingbase应用接入与连接池治理】JDBC驱动与连接串实战

【Kingbase应用接入与连接池治理】JDBC驱动与连接串实战 JDBC 驱动与连接串实战从默认system/test到业务库与应用账号这篇文章有个前提要说清楚默认你已经把基础环境弄好了我这里以Windows客户端和Linux服务端为例也就是说 Windows 11 本地开发机能访问 CentOS 7.6 服务器金仓数据库实例已经跑起来端口、防火墙、远程访问规则也都配好了。Windows 安装、CentOS 安装还有 Windows 连 CentOS 上的数据库这几块前面的文章里已经单独讲过这里不再重复。前置教程可参考Windows 本地安装金仓数据库教程Windows系统下KingbaseES数据库保姆级安装教程附常见问题解决CentOS 服务器安装金仓数据库教程CentOS 上安装KingbaseESISO包详细教程_金仓数据库安装教程-CSDN博客Windows 连接 CentOS 服务器上的金仓数据库《Kingbase护城河》——跨平台环境下的数据库联调实战-CSDN博客应用连接数据库失败往往不是业务代码复杂而是最基础的三件事没对齐驱动包、连接串、账号权限。本文从刚安装完成后的默认状态开始先用system账号连接默认test数据库再创建本专栏后续统一使用的业务库、Schema、应用账号和测试表最后用一个最小 Java 程序完成 JDBC 查询验证。文章目录JDBC 驱动与连接串实战从默认 system/test 到业务库与应用账号一、实验目标二、创建业务库、Schema 和应用账号三、准备 JDBC 驱动四、理解连接串五、编写最小 Java 连接程序六、在 Windows 11 上编译运行七、把连接信息从代码里抽出来八、连接成功后要验证什么1. 身份验证2. 权限验证3. 异常验证九、常见错误1. 找不到驱动类或协议不识别2. Connection refused3. 认证失败4. relation 或 table 不存在5. 中文乱码十、小结一、实验目标本篇要完成五件事使用默认system/test连接远端服务器。创建后续专栏统一使用的业务库和账号。写出可读、可复用的连接串。准备 JDBC 驱动。用 Java 程序查询远端数据库中的测试表。统一环境如下表中 IP 仅为示例实际使用时替换为自己的服务器地址项目示例值本地系统Windows 11服务端系统CentOS 7.6数据库服务端 IP192.168.10.101数据库端口54321初始数据库test初始用户system业务数据库kb_app业务 Schemashop应用账号app_user只读账号report_user测试表shop.t_connection_check开始写 Java 代码前先用默认账号确认这条链路已经能手工连接ksql -h 192.168.10.101 -p 54321 -U system -d test这里如果还连不上的话先回到跨平台连接教程排查网络、监听地址、防火墙和认证规则。本专栏从默认system/test已经能远程连接这个前提出发。二、创建业务库、Schema 和应用账号默认的那个test数据库适合做初始验证。但是直接拿它做后续应用开发的库不太建议。那咱们先用system用户建一个业务库kb_appCREATEDATABASEkb_app;退出当前连接。接着重新连到kb_appksql -h 192.168.10.101 -p 54321 -U system -d kb_app然后咱们建业务Schema、应用账号还有只读账号CREATESCHEMAshop;CREATEUSERapp_userWITHPASSWORDApp_user_123;CREATEUSERreport_userWITHPASSWORDReport_user_123;GRANTUSAGEONSCHEMAshopTOapp_user;GRANTUSAGEONSCHEMAshopTOreport_user;GRANTCREATEONSCHEMAshopTOapp_user;如果你环境里已经有同名数据库、Schema或者用户了。那你先确认一下它们是不是本文要弄的这些。如果不是的话我建议你换个业务库名或者账号名。这样能避免误操作已有环境。接着咱们建本专栏第一张测试表CREATETABLEshop.t_connection_check(idINTPRIMARYKEY,check_nameVARCHAR(64),created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP);INSERTINTOshop.t_connection_check(id,check_name)VALUES(1,jdbc_check_ready);给应用账号读写权限。只读账号给个查询权限就行GRANTSELECT,INSERT,UPDATE,DELETEONshop.t_connection_checkTOapp_user;GRANTSELECTONshop.t_connection_checkTOreport_user;最后用应用账号验证一次ksql -h 192.168.10.101 -p 54321 -U app_user -d kb_app进去后执行SELECTcurrent_database(),current_user;SELECT*FROMshop.t_connection_check;要是你能看到kb_app、app_user还有jdbc_check_ready这条记录。那就说明后面需要的基础对象都准备好了。三、准备 JDBC 驱动JDBC驱动这个东西通常来说在金仓数据库安装目录、客户端工具目录或者官方提供的驱动包里都能找到。本文Windows安装目录示例用的是D:\Tools\Kingbase。你安装路径不一样的话记得换成自己的实际目录。在Windows 11上咱们可以先搜一下驱动包。下面这个命令是以我本机路径为例的。执行的时候把$kbHome换成你自己的实际安装目录就行$kbHomeD:\Tools\KingbaseGet-ChildItem-LiteralPath$kbHome-Recurse-File-Filterkingbase*.jar-ErrorAction SilentlyContinue|Where-Object{$_.FullName-like*\Interface\jdbc\*}|Select-ObjectFullName我环境里搜到的 KingbaseES V9R2C13 JDBC 驱动路径是这样的D:\Tools\Kingbase\KESV9R2C13\KES\KESRealPro\V009R002C013\Interface\jdbc\kingbase8-9.0.0.jar同一个目录下你可能还会看到kingbase8-9.0.0.jre6.jar、kingbase8-9.0.0.jre7.jar这种。这种是兼容旧 JRE 的包。咱们本地用的 JDK 比较新的话直接选kingbase8-9.0.0.jar就行了。找到 JDBC 驱动后我建议你统一复制到项目的lib目录。比如像这样kb-jdbc-demo |-- lib | -- kingbase8-9.0.0.jar |-- src | -- DbConnectCheck.java复制命令如下New-Item-ItemType Directory-Force-Path.\libCopy-Item-LiteralPathD:\Tools\Kingbase\KESV9R2C13\KES\KESRealPro\V009R002C013\Interface\jdbc\kingbase8-9.0.0.jar-Destination.\lib\kingbase8-9.0.0.jar-Force如果你项目用的是 Maven 或者 Gradle。那优先按企业层级里的内部制品库或者官方推荐的方式去引入驱动。本文为了减少前置依赖先用最小Java文件演示一下。四、理解连接串应用连接数据库的核心就是 JDBC URL。示例形式如下jdbc:kingbase8://192.168.10.101:54321/kb_app其实拆开来看很简单就是几段拼在一起jdbc:kingbase8JDBC 协议和驱动识别前缀以实际驱动说明为准。192.168.10.101CentOS 数据库服务器 IP。54321数据库监听端口。kb_app刚才创建的业务数据库名。如果你的环境启用了额外安全参数或字符集参数需要按驱动文档追加到 URL 后面。初次接入的话不建议一次性堆很多参数先用最小连接串打通再逐步增加连接超时、应用名等参数。五、编写最小 Java 连接程序新建src\DbConnectCheck.javaimportjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;publicclassDbConnectCheck{publicstaticvoidmain(String[]args)throwsException{Stringurljdbc:kingbase8://192.168.10.101:54321/kb_app;Stringuserapp_user;StringpasswordApp_user_123;Stringsqlselect id, check_name, created_at from shop.t_connection_check where id ?;try(ConnectionconnDriverManager.getConnection(url,user,password);PreparedStatementpsconn.prepareStatement(sql)){System.out.println(connected!conn.isClosed());ps.setInt(1,1);try(ResultSetrsps.executeQuery()){if(rs.next()){System.out.println(idrs.getInt(id));System.out.println(check_namers.getString(check_name));System.out.println(created_atrs.getTimestamp(created_at));}else{System.out.println(no data found);}}}}}这段代码有几个值得注意的地方使用PreparedStatement不要把参数直接拼到 SQL 字符串里。使用try-with-resources确保连接、语句、结果集都能正常关闭。SQL 显式写业务 Schema避免依赖默认 Schema 搜索路径。六、在 Windows 11 上编译运行进入项目目录cd D:\work\kb-jdbc-demo编译javac-encoding UTF-8-cp.;lib\kingbase8-9.0.0.jarsrc\DbConnectCheck.java运行java-cp.;lib\kingbase8-9.0.0.jar;srcDbConnectCheck如果输出类似下面内容说明 JDBC 链路已经打通如果命令执行后很快返回但没有任何结果通常不是程序卡住了而是查询没有打印出可见信息。上面的示例会先输出connectedtrue再输出查询结果。如果看到no data found的话说明连接已经成功但shop.t_connection_check中没有id 1这条记录需要回到前面的建表和插入步骤检查一下。如果你使用的是 PowerShell注意 classpath 分隔符在 Windows 上是分号;。在 Linux 上运行的话分隔符一般是冒号:。七、把连接信息从代码里抽出来上面的写法适合第一次验证但不适合长期维护。连接信息不应该硬编码在 Java 类里。可以先建一个简单的配置文件db.propertiesdb.urljdbc:kingbase8://192.168.10.101:54321/kb_app db.userapp_user db.passwordApp_user_123Java 中读取配置importjava.io.FileInputStream;importjava.sql.Connection;importjava.sql.DriverManager;importjava.util.Properties;publicclassDbConfigCheck{publicstaticvoidmain(String[]args)throwsException{PropertiespropsnewProperties();try(FileInputStreaminnewFileInputStream(db.properties)){props.load(in);}try(ConnectionconnDriverManager.getConnection(props.getProperty(db.url),props.getProperty(db.user),props.getProperty(db.password))){System.out.println(connected!conn.isClosed());System.out.println(databaseconn.getCatalog());}}}这样做的好处是后续迁移到 Spring Boot、测试环境、生产环境时连接信息可以交给配置中心、环境变量或启动参数管理不需要动代码。八、连接成功后要验证什么不要只看到程序没有报错就算接入成功。至少做三类验证。1. 身份验证确认当前连接到底使用了哪个数据库和哪个账号SELECTcurrent_database(),current_user;可以在 Java 程序里执行这条 SQL也可以通过 ksql 对比。2. 权限验证用app_user测试正常读写INSERTINTOshop.t_connection_check(id,check_name)VALUES(2,jdbc_insert_ok);SELECT*FROMshop.t_connection_checkWHEREid2;再用report_user连接kb_app测试只读确认它能查询shop.t_connection_check但不能执行写入操作。3. 异常验证故意把密码写错看应用是否能清晰输出认证失败故意把 IP 写错看是否有连接超时故意把表名写错看是否能定位 SQL 错误。上线前提前看过这些错误后面排障会快很多。九、常见错误1. 找不到驱动类或协议不识别通常是 JDBC jar 没放进 classpath或者驱动版本和连接串前缀不匹配。先确认运行命令里包含了驱动 jar。2. Connection refused这不是 Java 代码问题优先回到前置跨平台连接教程检查端口监听、防火墙、安全组和数据库监听地址。3. 认证失败检查用户名、密码、数据库名、认证规则和账号是否被锁定。本文前半部分使用system/test做初始连接后半部分使用app_user/kb_app做应用连接排查时不要把这两组账号和数据库混在一起。4. relation 或 table 不存在如果表确实存在重点检查 Schema。建议 SQL 中明确写shop.t_connection_check不要依赖默认搜索路径。5. 中文乱码先确认数据库、客户端、Java 源文件、控制台输出编码。Windows 命令行环境下可以优先使用 PowerShell并在编译时指定-encoding UTF-8。十、小结JDBC 接入的核心不是写多少代码而是把驱动、连接串、账号权限和验证 SQL 做对。本文从默认system/test起步创建了后续专栏统一使用的kb_app、shop、app_user、report_user和shop.t_connection_check并用最小 Java 程序完成了第一次 JDBC 查询验证。下一篇我们进入 Spring Boot把单文件连接验证升级成更贴近真实项目的应用配置方式。