Spring JDBC结合PostgreSQL报错:createClob()方法未实现求助
解决Spring Batch + PostgreSQL 中 createClob() 未实现的异常
问题背景
维护基于Spring JDBC、PostgreSQL 42.4.24驱动的遗留应用时,批处理执行更新查询失败,抛出以下异常:
Caused by: java.sql.SQLFeatureNotSupportedException: Method org.postgresql.jdbc.PgConnection.createClob() is not yet implemented. at org.postgresql.Driver.notImplemented(Driver.java:699) ~[postgresql-42.2.24.jar:42.2.24] at org.postgresql.jdbc.PgConnection.createClob(PgConnection.java:1344) ~[postgresql-42.2.24.jar:42.2.24] at org.apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.java:868) ~[commons-dbcp2-2.1.1.jar:2.1.1] at org.apache.commons.dbcp2.DelegatingConnection.createClob(DelegatingConnection.java:868) ~[commons-dbcp2-2.1.1.jar:2.1.1] at org.springframework.jdbc.support.lob.TemporaryLobCreator.setClobAsString(TemporaryLobCreator.java:101) ~[spring-jdbc-4.0.5.RELEASE.jar:4.0.5.RELEASE] at org.springframework.batch.core.repository.dao.JdbcExecutionContextDao$1.setValues(JdbcExecutionContextDao.java:238) ~[spring-batch-core-3.0.3.RELEASE.jar:3.0.3.RELEASE] at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:914) ~[spring-jdbc-4.0.5.RELEASE.jar:4.0.5.RELEASE] at org.springframework.jdbc.core.JdbcTemplate$2.doInPreparedStatement(JdbcTemplate.java:909) ~[spring-jdbc-4.0.5.RELEASE.jar:4.0.5.RELEASE] at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:644) ~[spring-jdbc-4.0.5.RELEASE.jar:4.0.5.RELEASE]
核心原因是PostgreSQL JDBC驱动未实现createClob()方法,但Spring Batch的JdbcExecutionContextDao在处理执行上下文时触发了该方法调用。
解决方案
1. 添加数据库连接参数(最简便)
在PostgreSQL的JDBC URL中加入stringtype=unspecified参数,让驱动自动将字符串参数按VARCHAR处理,避免触发Clob创建逻辑:
jdbc:postgresql://localhost:5432/your_database?stringtype=unspecified
2. 配置Spring的LobHandler
自定义LobHandler,禁用临时Clob创建。在Spring配置中添加:
- XML配置:
<!-- 定义LobHandler --> <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler"> <property name="createTemporaryLob" value="false"/> </bean> <!-- 注入到JobRepository --> <bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="transactionManager" ref="transactionManager"/> <property name="lobHandler" ref="lobHandler"/> </bean>
- Java配置:
@Bean public JobRepository jobRepository(DataSource dataSource, PlatformTransactionManager transactionManager) throws Exception { JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean(); factory.setDataSource(dataSource); factory.setTransactionManager(transactionManager); // 禁用临时Lob创建 factory.setLobHandler(new DefaultLobHandler(false)); factory.afterPropertiesSet(); return factory.getObject(); }
3. 谨慎升级依赖版本
当前使用的Spring JDBC 4.0.5、Spring Batch 3.0.3版本较老,升级到兼容PostgreSQL的新版本(如Spring JDBC 4.3.x+、Spring Batch 3.0.10+)可能修复该兼容性问题,但遗留系统升级前需充分测试,避免引入其他风险。
4. 替换连接池(可选)
将当前的commons-dbcp2替换为HikariCP,它对PostgreSQL连接的处理更友好,可能绕过createClob()的调用问题:
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource"> <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/your_database"/> <property name="username" value="your_username"/> <property name="password" value="your_password"/> </bean>
内容的提问来源于stack exchange,提问作者Adithya N
相关产品推荐
相关产品推荐

