Spring Boot高版本Snowflake JDBC驱动JdbcTemplate查询报错求助
Snowflake JDBC驱动升级后JdbcTemplate查询表不存在问题解决
问题现象
Spring Boot应用使用JdbcTemplate+RowMapper从Snowflake获取数据,snowflake-jdbc 3.6.8/3.7.2版本运行正常,但升级到3.8.x及以上版本后,抛出异常:
net.snowflake.client.jdbc.SnowflakeSQLException: SQL compilation error: Object 'my_table_name' does not exist or not authorized
但直接通过DriverManager创建Connection的方式可以正常执行查询。
问题原因
Snowflake JDBC驱动3.8+版本调整了连接参数的传递逻辑,原配置中将db、schema、warehouse、role等参数放在URL查询串中,同时单独配置username/password的混合方式,会导致驱动无法正确初始化会话的默认数据库和Schema,进而查询时找不到目标表。而直接用DriverManager+Properties的方式是标准参数传递流程,不受该逻辑变化影响。
解决方案
修改application.properties的数据源配置,将URL中的Snowflake专属参数(user、password、db、schema、warehouse、role)移除,改用HikariCP的data-source-properties传递这些参数,确保驱动能正确接收所有会话初始化参数:
spring.datasource.driver-class-name=net.snowflake.client.jdbc.SnowflakeDriver # 仅保留基础URL和必要的连接参数 spring.datasource.url=jdbc:snowflake://<accountname>.snowflakecomputing.com:443/?CLIENT_SESSION_KEEP_ALIVE=true spring.datasource.username=xxx spring.datasource.password=xxx # 通过Hikari传递Snowflake专属参数 spring.datasource.hikari.data-source-properties.db=xxx spring.datasource.hikari.data-source-properties.schema=xxx spring.datasource.hikari.data-source-properties.warehouse=xxx spring.datasource.hikari.data-source-properties.role=xxx spring.jpa.database=default spring.jpa.properties.hibernate.dialect=com.example.demo.SnowflakeDialect
验证方式
应用启动后,可在DAO中先执行以下查询确认会话配置是否正确:
String checkSql = "SELECT CURRENT_DATABASE(), CURRENT_SCHEMA(), CURRENT_WAREHOUSE(), CURRENT_ROLE()"; String[] sessionInfo = jdbcTemplate.queryForObject(checkSql, String[].class);
返回结果应与配置的参数一致,说明会话初始化正确。
内容的提问来源于stack exchange,提问作者Nid
相关产品推荐
相关产品推荐

