ob-client 执行insert报错Parameter is not set

【 使用环境 】测试环境
【 OB or 其他组件 】 ob-client 2.4.11有异常,降版本到2.4.2无异常
【 使用版本 】2.4.11
【问题描述】清晰明确描述问题
【复现路径】问题出现前后相关操作
【附件及日志】

<!--db & mybatis 依赖-->
        <!--db 依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.vsersion}</version>
            <!--排除依赖-->
            <exclusions>
                <exclusion>
                    <artifactId>mybatis-spring</artifactId>
                    <groupId>org.mybatis</groupId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--升级版本-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>3.0.3</version>
        </dependency>
        <!--配置动态数据源-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
            <version>3.6.1</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.jdbc</groupId>
            <artifactId>ojdbc8</artifactId>
            <version>19.8.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.oracle.database.nls</groupId>
            <artifactId>orai18n</artifactId>
            <version>19.15.0.0</version>
        </dependency>
        <dependency>
            <groupId>com.oceanbase</groupId>
            <artifactId>oceanbase-client</artifactId>
            <version>2.4.12</version>
        </dependency>

注意:下面insert 语句操作16个字段, 报错cause信息说的是17号字段

### Error updating database.  Cause: java.sql.SQLTransientConnectionException: (conn=1567407) Parameter at position 17 is not set
### The error may exist in com/xxxx/predict/repository/mapper/PredictModelPmmlLogMapper.java (best guess)
### The error may involve com.xxxx.predict.repository.mapper.PredictModelPmmlLogMapper.insert-Inline
### The error occurred while setting parameters
### SQL: INSERT INTO T_PREDICT_MODEL_PMML_LOG  ( LOG_ID, PMML_ID, MODEL_ID, PMML_VERSION, ALGORITHM,   PMML_NAME, PMML_FILE, PMML_FILE_FORMAT,  OUTPUT_FIELD_FOR_RULE,  STATUS, CREATE_TIME, CREATE_USER, UPDATE_TIME, UPDATE_USER, OP_TYPE, OP_DESC )  VALUES (  ?, ?, ?, ?, ?,   ?, ?, ?,  ?,  ?, ?, ?, ?, ?, ?, ?  )
### Cause: java.sql.SQLTransientConnectionException: (conn=1567407) Parameter at position 17 is not set
; (conn=1567407) Parameter at position 17 is not set
	at org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:74)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:107)
	at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:116)
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)
	at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:439)
	at jdk.proxy2/jdk.proxy2.$Proxy152.insert(Unknown Source)
	at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272)
	at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152)
	at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89)
	at jdk.proxy2/jdk.proxy2.$Proxy210.insert(Unknown Source)
…………

再看看cause by 堆栈

在此处键入或粘贴代码
1 个赞

PredictModelPmmlLogMapper 这个相关的mapper 是怎么写的?堆栈搞完整点,都看不到oceanbase的相关堆栈。

试着把租户参数 ob_enable_batched_multi_statement 设置为true,再看看

是mybatis p的mapper方案,报错堆栈用的是BaseMapper#insert:

@Mapper
public interface PredictModelPmmlLogMapper extends BaseMapper {

}

看不出来啥,给下实体类型定义吧,jdbc url 的完整参数也给下。

麻烦提供一下OB-JDBC的参数

jdbc:oceanbase:loadbalance://@(NET_SERVICE_NAME=(DESCRIPTION=(OBLB=ON)(OBLB_RETRY_ALL_DOWNS=20)(OBLB_BLACKLIST=(REMOVE_STRATEGY=((NAME=TIMEOUT)(TIMEOUT=100)))(APPEND_STRATEGY=((NAME=RETRYDURATION)(RETRYTIMES=3)(DURATION=10000))))(ADDRESS_LIST=(OBLB_STRATEGY=SERVERAFFINITY)(ADDRESS=(PROTOCOL=tcp)(HOST=172.20.21.110)(PORT=2883))(WEIGHT=1))(ADDRESS=(PROTOCOL=tcp)(HOST=172.20.20.40)(PORT=2883))(WEIGHT=1)))(CONNECT_DATA=(SERVICE_NAME=RISK_TRADE))))

感谢回复
补充:执行 查询、更新 不会报错,做insert则报错。
po实体:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

/**

  • 风险预测模型-版本配置信息-日志表

  • @author yourName

  • @since 2024-11-06
    */
    @Data
    @EqualsAndHashCode(callSuper = false)
    @TableName(“T_PREDICT_MODEL_PMML_LOG”)
    public class PredictModelPmmlLogPo {

    private static final long serialVersionUID = 1L;

    @TableId(value = “LOG_ID”, type = IdType.AUTO)
    private String logId;

    @TableField(“PMML_ID”)
    private String pmmlId;

    /**

    • 模型
      */
      @TableField(“MODEL_ID”)
      private String modelId;

    /**

    • 版本号
      */
      @TableField(“PMML_VERSION”)
      private Integer pmmlVersion;

    @TableField(“ALGORITHM”)
    private String algorithm;

    /**

    • 超参数
      */
      @TableField(“HYPER_PARAM”)
      private String hyperParam;

    /**

    • 模型参数、特征参数excel文件路径
      */
      @TableField(“X_PARAM_FILE”)
      private String xParamFile;

    @TableField(“PMML_NAME”)
    private String pmmlName;

    /**

    • PMML文件路径
      */
      @TableField(“PMML_FILE”)
      private String pmmlFile;

    @TableField(“PMML_FILE_FORMAT”)
    private String pmmlFileFormat;

    /**

    • 训练数据集路径
      */
      @TableField(“TRAIN_DATA_FILE”)
      private String trainDataFile;

    /**

    • 模型输出值的转译描述、将作为【规则参数】
      */
      @TableField(“OUTPUT_FIELD_FOR_RULE”)
      private String outputFieldForRule;

    /**

    • 备注
      */
      @TableField(“REMARK”)
      private String remark;

    /**

    • 模型状态(枚举)
      */
      @TableField(“STATUS”)
      private String status;

    @TableField(“CREATE_TIME”)
    private Date createTime;

    @TableField(“CREATE_USER”)
    private String createUser;

    @TableField(“UPDATE_TIME”)
    private Date updateTime;

    @TableField(“UPDATE_USER”)
    private String updateUser;

    /**

    • 操作类型
      */
      @TableField(“OP_TYPE”)
      private String opType;

    /**

    • 操作说明
      */
      @TableField(“OP_DESC”)
      private String opDesc;
1 个赞

inser 没有重写吧?就mybatis plus 的标准接口?

是的。

debug时,发现 步骤有做额外拼接:
INSERT INTO T_PREDICT_MODEL_PMML_LOG ( LOG_ID, PMML_ID, MODEL_ID, PMML_VERSION, ALGORITHM, PMML_NAME, PMML_FILE, PMML_FILE_FORMAT, OUTPUT_FIELD_FOR_RULE, STATUS, CREATE_TIME, CREATE_USER, UPDATE_TIME, UPDATE_USER, OP_TYPE, OP_DESC ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) returning LOG_ID into ?
—— 末尾出现了第17个问号占位符!

useOraclePrepareExecute=true,有没有带这个参数??

这里 PO类的id声明为:
@TableId(value = “LOG_ID”, type = IdType.AUTO)
private String logId;
—— 把 “, type = IdType.AUTO”去掉,就能正常insert了

@辞霜 @try_again @菜鸟收割机 暂时这样修复下。另外,po类是由mybatis p 代码生成的,这样的TableId声明符合ob最佳实践吗?

2 个赞

:+1:

这样就应该不返回主键了。 :+1:

你这个应该是oracle模式,社区版没有建议咨询商业技术支持