当前位置: 首页 > 知识库问答 >
问题:

JDBC prepared语句创建了一个额外的数据库命中,没有任何参数

甘君之
2023-03-14

我有一个恼人的问题,我不明白为什么会发生。为了简单介绍一下,我在Spring Boot项目中使用MySql和JDBC模板实现了批处理(batch insert)。

因此,基本上批插入工作正常,性能非常惊人,但有一个小问题非常烦人,当我插入一个表时,它会导致约束异常,该表在两列(id,value)上有唯一的键。

所以我有以下代码:

private String INSERT_SQL_PARAMS = "INSERT INTO item_params(p_key, p_value, item_id) values (?,?,?)"

override fun saveParams(configParams: Set<ItemParam>) {
    jdbcTemplate!!.update { connection ->
        connection.autoCommit = false
        val ps: PreparedStatement = connection.prepareStatement(INSERT_SQL_PARAMS)

        configParams.forEachIndexed { index, it ->
            ps.setLong(1, it.configurationId)
            ps.setString(2, it.pKey)
            ps.setString(3, it.pValue)
            ps.addBatch()

            if (index != 0 && index % 1000 == 0) {
                ps.executeBatch()
                connection.commit()
            }
        }

        ps.executeBatch()
        connection.commit()
        ps
    }
}

当我在Spring Boot中使用数据源代理查看日志时,我可以看到执行的实际查询。

所以当我想一次插入例如2个项目时,我在日志中看到了这一点:

Batch: True, INSERT INTO item_param(item_id, p_key, p_value) values (1, 1, 1), (2, 2, 2)
Batch: False, INSERT INTO item_param(item_id, p_key, p_value) values ()

正如你所看到的,我总是在最后看到一个没有任何值的额外/备用语句,出于某种原因,log说Batch=False。

有人能看到我的代码中缺少的东西吗?为什么会发生这种情况?我能用它做些什么?

此外,我还有一个问题,例如,如果我有1000条记录,我将执行两次批处理,一次在if语句中,一次在末尾。是否只有在查询中有参数时,我才能说ps.executeBatch?

共有1个答案

后学
2023-03-14

因为jdbcTemplate.update为您执行SQL,所以它会在代码末尾自动调用执行

由于它只调用execute一次,因此不符合您的目的。尝试使用jdbc模板的本教程。批量更新。它为您实现对jdbcConnection的多个调用。

 类似资料:
  • 本文向大家介绍必须会的SQL语句(一) 创建数据库与删除数据库,包括了必须会的SQL语句(一) 创建数据库与删除数据库的使用技巧和注意事项,需要的朋友参考一下 1.创建数据库 2.删除数据库 只能用drop    drop database 名称

  • 但我有以下问题: 这是我的docker-compose.yml文件 我的Postgres.DockerFile是

  • 问题内容: 由于已经暗示了该关系,因此我不想在db中创建约束。我该怎么办? 目前,我在进行Alembic迁移后手动删除这些约束。 问题答案: 无需定义“模式”级别约束,而是创建自定义的外部条件;将您要用作“外键”的列以及传递给。您必须手动定义原因,因为: 默认情况下,此值是基于父表和子表(或关联表)的外键关系计算的。 外键也可以在using中内联注释: 您可以验证没有为表 c 发出约束: 警告:

  • 问题内容: 我正在尝试设计一个Java swing应用程序。我想尝试并使用MVC类型的体系结构,从而使我的UI与实际逻辑分离,以访问数据并连接到数据库。我已经决定需要创建一个自定义类,其中包含连接到数据库的所有逻辑,然后在我的动作事件中针对任何特定的窗体和按钮简单地从此类中调用方法。这样,我可以切换数据库,而我需要做的所有事情(如果我有许多形式的大型代码库)是更改JDBC连接字符串以连接到orac

  • 我是azure databricks的新手,正在尝试创建一个外部表,指向Azure Data Lake Storage(ADLS)Gen-2位置。 我尝试从数据库笔记本设置ADLS访问的火花配置。我仍然无法执行创建的DDL。 注意:一个适合我的解决方案是将ADLS帐户装载到集群,然后使用外部表的DDL中的装载位置。但我需要检查是否可以使用ADLS路径创建一个外部表DDL,而无需安装位置。 数据链路

  • 问题内容: 我试图从DetailViewController类调用在ViewController类中声明的函数。 尝试调试“通话中的额外参数”时,会弹出错误消息。 在ViewController类中: 在详细信息ViewController类 这很简单,但我感到困惑。 问题答案: 在某些情况下,即使参数调用的类型与函数声明的类型不匹配,即使调用看起来正确,也会给出“调用中的附加参数”。从您的问题来