You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 12:47:16