JNDI配置指定DB2 Schema时表找不到,普通连接正常求助
解决Tomcat JNDI配置DB2时currentSchema不生效的问题
问题背景
直接在Spring Boot的spring.datasource.url中指定currentSchema可正常连接DB2:
spring.datasource.url=jdbc:db2:/server:xxxx/ins:currentSchema=DEVSCHEMA;
但使用Tomcat JNDI配置数据源时,相同URL会触发DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704错误,提示找不到DEVSCHEMA.tablename对象。环境为Spring Boot 2.7.4,依赖jcc-11.5.7.0.jar、ojdbc6-11.2.0.4.jar。
解决方法
方法1:将currentSchema作为Resource独立参数配置
Tomcat JDBC数据源工厂可能无法正确解析URL中的currentSchema参数,可将该参数从URL中移除,作为Resource标签的单独属性配置:
<Resource auth="Container" defaultAutoCommit="false" driverClassName="com.ibm.db2.jcc.DB2Driver" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" initialSize="10" maxActive="100" maxIdle="80" minEvictableIdleTimeMillis="55000" minIdle="30" name="jdbc/connDB" password="xxxxxxx" removeAbandoned="true" removeAbandonedTimeout="55" testOnBorrow="true" timeBetweenEvictionRunsMillis="34000" type="javax.sql.DataSource" url="jdbc:db2:/server:xxxx/ins" username="xxxxx" validationInterval="34000" validationQuery="select 1 from sysibm.sysdummy1" currentSchema="DEVSCHEMA"/>
方法2:修正DB2 JDBC URL格式
确保URL符合DB2标准格式(添加双斜杠//),保留currentSchema参数:
url="jdbc:db2://server:xxxx/ins:currentSchema=DEVSCHEMA;"
部分环境下URL格式的细微差异会导致参数解析失败,修正后可重新部署验证。
方法3:通过Spring Boot配置强制指定Schema
如果前两种方法无效,可在Spring Boot的application.properties中直接为数据源指定默认Schema:
spring.datasource.jndi-name=java:comp/env/jdbc/connDB spring.datasource.schema=DEVSCHEMA
原因说明
SQLCODE=-204错误本质是JNDI配置的数据库连接未正确应用currentSchema参数。Tomcat数据源工厂对URL参数的解析逻辑与Spring Boot直接配置存在差异,导致URL中的currentSchema未被DB2驱动正确识别,从而无法定位指定Schema下的表对象。
内容的提问来源于stack exchange,提问作者prasunmax
相关产品推荐
相关产品推荐

