MySQL租户模式下,ParameterMetaData获取异常

【 使用环境 】测试环境
【 使用版本 】5.7.25-OceanBase_CE-v4.2.1.4
【 HikariCP版本 】4.0.3
【 mysql-connector-java 】8.0.29

问题描述
从下图可以看到获取到的parameterMetaData中的fields数组明显是错误的,长度为3(少1),且其中的各个字段都未正确获取到(MySQL数据库能正常获取到)

建表语句

create table test (
	a varchar(10) primary key,
	b int,
	c int,
	d decimal(16,8)
);

代码

public static void main(String[] args) {

        String sql = "INSERT INTO test(a,b,c,d) \n" +
                "VALUES (?,?,?,?)";


        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        dataSource.setJdbcUrl("jdbc:mysql://ip:port/test?rewriteBatchedStatements=true&useServerPrepStmts=true&useCursorFetch=true");
        dataSource.setUsername("root@sys");


        try(Connection connection = dataSource.getConnection();
            PreparedStatement preparedStatement = connection.prepareStatement(sql)){

            ParameterMetaData parameterMetaData = preparedStatement.getParameterMetaData();

            System.out.println("----------");

        } catch (Exception e){
            e.printStackTrace();
        } finally {
            dataSource.close();
        }

    }

造成的影响
该问题是我在用springBatch批量写入报空指针异常后发现的(oceanbase作为被写入方),在获取field时,入参数量30,第29时收到报文EOF导致跳过,最终在getColumnType的if判断中f=null


1 个赞

你好 有2个地方需要调整再测试看看

1)最新版本mysql驱动可能有未兼容的地方,推荐使用5.1.47或者8.0.25以下的驱动。
2)看配置使用的是root@sys租户,sys租户仅作为管理租户使用,需要再新建个业务租户进行使用。

1 个赞

我按照教程创建了新的租户,经过测试租户没有产生影响,后面我把mysql驱动版本调整为下面版本
api group: ‘mysql’, name: ‘mysql-connector-java’, version: ‘5.1.47’
从下图实际上只解决了一部分问题,fields不会在包含空对象了,但对象的类型还是错误的

而且该系统有对接MySQL8,所以调整驱动可能不是个好的解决方案

1 个赞

这个问题我们需要内部测验下,后续会在帖子中答复。

您好,目前内部测试不同mysql驱动版本/objdbc也存在类型错误问题,基本定位是产品缺陷,ps场景下,ob返回的type类型与原生mysql不同,后续会进行修复。