第一次在SpringBoot项目里集成OceanBase时,我像大多数开发者一样直接复制了官方示例代码,结果迎面撞上"Access denied"错误。后来才发现,OceanBase的配置细节比传统MySQL要复杂得多。我们先从最基础的依赖配置说起。
在pom.xml中添加OceanBase JDBC驱动时,建议直接使用Maven中央仓库的最新稳定版。我遇到过有人从非官方渠道下载驱动包,结果连版本兼容性问题都排查了半天:
xml复制<dependency>
<groupId>com.oceanbase</groupId>
<artifactId>oceanbase-client</artifactId>
<version>2.4.3</version>
</dependency>
这里有个容易忽略的点:OceanBase驱动默认不包含在SpringBoot的自动配置体系里。我建议在application.properties里显式声明驱动类名,避免SpringBoot自动推断时出错:
properties复制spring.datasource.driver-class-name=com.oceanbase.jdbc.Driver
直连OBServer节点的配置方式适合测试环境,我通常在本地开发时用这种模式。关键点在于用户名格式必须遵循"用户名@租户名"的规范:
properties复制spring.datasource.url=jdbc:oceanbase://10.10.10.1:2881/test
spring.datasource.username=sys@xyoracle
spring.datasource.password=your_password
这里踩过的坑是端口号——OceanBase默认使用2881端口而非MySQL的3306。有次我给运维同事报错,结果发现是他防火墙忘了开这个端口。
生产环境更推荐使用ODP(OceanBase Database Proxy)模式,相当于OceanBase的"路由器"。配置差异主要在三点:
properties复制spring.datasource.url=jdbc:oceanbase://proxy_host:2883/test
spring.datasource.username=sys@xyoracle#cluster_name
spring.datasource.password=your_password
特别注意用户名格式变成了"用户名@租户名#集群名"。去年我们生产环境升级时,就因为漏了集群名后缀导致整个服务不可用。
看到"Access denied for user"错误时,我通常会按这个顺序排查:
用户名格式验证:检查是否遗漏租户名或集群名后缀。有次我写了root@tenant,实际需要root@tenant#cluster
密码特殊字符处理:如果密码包含@或#等符号,记得用URL编码。曾经有个案例是密码里的@符号被解析成了用户名分隔符
租户权限检查:通过OceanBase客户端连上后执行:
sql复制SHOW GRANTS FOR 'username'@'%';
在云环境部署时,这些网络配置最容易出问题:
我习惯用telnet快速测试连通性:
bash复制telnet oceanbase_host 2881
结合HikariCP的配置经验,我总结出这些OceanBase专属参数:
properties复制spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.maximum-pool-size=20
spring.datasource.hikari.idle-timeout=600000
特别注意:OceanBase的wait_timeout默认是28800秒(8小时),建议连接池的idle-timeout设置略小于这个值。
在Spring Actuator中添加JDBC健康检查:
properties复制management.endpoint.health.show-details=always
management.health.db.enabled=true
这样可以在/actuator/health端点看到详细的数据库连接状态,去年我们靠这个功能及时发现了一个ODP节点异常。
去年金融项目上线时遇到一个典型问题:应用在测试环境正常,生产环境却报"Access denied"。最终发现是生产环境使用了三集群部署,而测试代码里漏了集群名后缀。现在的团队规范要求所有OceanBase连接配置必须经过三重检查:
这个案例让我深刻体会到,OceanBase的集群化特性虽然带来了高可用优势,但也增加了配置的复杂度。建议大家在项目初期就建立严格的配置管理规范。