Uno de los casos en los que la inserción de lotes de mybatis JDBC es lenta

        En un nuevo proyecto, verifique el procesamiento lento de una tarea programada. La base de datos es pgsql. Se encontró que la operación de inserción toma más tiempo. 2000 registros pueden demorar hasta 4 segundos, 9000 registros pueden demorar hasta 25 segundos y 200.000 registros pueden tardar unos asombrosos 750 segundos. .

Busque soluciones para la inserción lenta, probablemente de las siguientes dos maneras:

1. Agregue un parámetro a la URL de jdbc, vuelva a escribir la declaración de inserción y combine varias oraciones en una oración para aumentar la velocidad. 

        mysql 加 rewriteBatchedStatements=true

        pgsql y reWriteBatchedInserts=true

Uso pgsql para este proyecto, incluso si agrego parámetros, todavía no funciona, y algunas personas dicen que es un problema de versión del controlador, incluso cambiar la versión no funciona, así que no sé dónde está el problema. el momento. Por supuesto sería lo mejor y más conveniente si este método puede surtir efecto.

2. No use el método saveBatch predeterminado de mybatis, pero personalice la declaración de inserción en mapper.xml y conecte el valor que se insertará a través de foreach. El principio de este método es similar al anterior. Sin embargo, debe tenerse en cuenta que si la declaración es demasiado larga, se informará un error y el tamaño de la declaración sql será limitado.

 Otra desventaja de usar este método es que, por ejemplo, los campos que generan automáticamente ids y timestamps deben crearse manualmente, por lo que esta solución no se utilizó en ese momento.

mi situación

        Cuando tuve un dolor de cabeza, descubrí que había múltiples preparaciones en la impresión del registro, como:

Preparando: INSERTAR EN datos ( id, hora_crear, nombre, id_kpi, unidad, mes_esperado, total_año, tipo_datos, id_config, wd ) VALORES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

Preparación: INSERTAR EN datos ( id, create_time, name, kpi_id, unit, data_type, config_id, wd ) VALORES ( ?, ?, ?, ?, ?, ?, ?, ? )

Preparando: INSERTAR EN datos ( id, hora_crear, nombre, id_kpi, unidad, mes_esperado, total_año, tipo_datos, id_config, wd ) VALORES ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )

Se puede ver que las reglas de inserción predeterminadas de mybatis ignoran la inserción de atributos nulos, lo que resulta en cambios constantes en la declaración de inserción.Si hay tres registros, hay tres campos de ABC, y cada registro tiene solo uno de los campos que No es nulo. Entonces, incluso si se trata de una inserción por lotes, aún preparará un sql diferente:

Preparando: INSERTAR EN datos ( A ) VALORES ( ? )

Preparando: INSERTAR EN datos ( B ) VALORES ( ? )

Preparando: INSERTAR EN datos ( C ) VALORES ( ? )

Y el objeto de entidad en mi proyecto tiene 6 o 7 atributos que pueden ser nulos. Esto también hace que el sql de preparación cambie continuamente cuando se insertan 9000 piezas de datos, lo que resulta en un consumo de tiempo de 25 segundos.

resolver

Entonces, conociendo esta situación, es fácil lidiar con ella. Verifique la estrategia predeterminada de mybatis para ignorar la inserción de valores nulos. Por supuesto, también puede especificar manualmente que no lo ignore. Simplemente agregue anotaciones a las propiedades:

@TableField(insertarEstrategia = FieldStrategy.IGNORADO)

Después de agregar ABC, no importa cuántas piezas se inserten, solo habrá una preparación:

Preparando: INSERTAR EN datos ( A, B, C ) VALORES ( ? ,?,?)

Después de la medición y modificación reales, el tiempo de inserción de 9000 datos en el proyecto se redujo a 3 segundos.

Supongo que te gusta

Origin blog.csdn.net/z409595641/article/details/127424235
Recomendado
Clasificación