[Sitio de prueba de entrevista de prueba escrita] La diferencia y la conexión entre PreparedStatement y Statement && optimización de la inserción de datos por lotes

contenido

1. La diferencia entre Declaración Preparada y Declaración para contactar

1. La conexión entre la declaración preparada y la declaración:

2. Diferencia:

2. Optimización gradual de datos de inserción por lotes en datos

1. Declaración de uso

2. Insertar usando PreparedStatement

3. Use caché por lotes para insertar

Cuatro. Cambiar el tiempo de envío para controlar el número de envíos para mejorar la eficiencia


1. La diferencia entre Declaración Preparada y Declaración para contactar

1. La conexión entre la declaración preparada y la declaración:

1. Todas son interfaces en la clase de empaquetado jdbc bajo sun company y no pertenecen a conexiones externas;

2.reparedStatement es una subinterfaz de la interfaz de declaraciones;

2. Diferencia:

1. PreparedStatement puede maximizar el rendimiento del sistema. PreparedStatement precompila sentencias SQL y DBServer optimizará el rendimiento de las sentencias SQL precompiladas. Las sentencias SQL precompiladas se pueden usar directamente en inserciones por lotes posteriores sin recompilar, lo que puede mejorar el rendimiento. Velocidad de lectura y escritura

2. En la declaración de la declaración, incluso si se opera la misma declaración SQL, debido a que el contenido insertado es diferente, la declaración SQL deberá compilarse nuevamente, lo que afectará la velocidad de lectura y escritura;

3. PreparedStatement puede prevenir la inyección de sql;

4. Usar PreparedStatement puede insertar datos de archivos de flujo de BLOb, pero Statement no puede insertar datos de Blob

5. El uso de datos de declaración requiere cadenas, la operación es engorrosa y también hay inyección de sql

2. Optimización gradual de datos de inserción por lotes en datos

1. Declaración de uso

2. Insertar usando PreparedStatement

    //批量插入方式二:使用PreparedStatement插入
    public void testInsertInfo() throws Exception {
        Connection conn = null;
        PreparedStatement pst = null;
        String sql = "insert into user_tab(id,name) values(?,?)";
        try {
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            pst = conn.prepareStatement(sql);
            for (int i = 1; i <20000 ; i++) {
                pst.setObject(1,i);
                pst.setObject(2,"name");
                pst.execute();
            }
            long end = System.currentTimeMillis();
            System.out.println("采用preparedStatement方式插入20000条数据花费的时间为:"+(end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,pst);
        }

    }

3. Use caché por lotes para insertar

 //批量插入方式三:使用批处理插入
    /*
    1.使用 添加batch :addBatch()  执行batch:executeBatch()  清空Batch(): clearBatch();
    2.在连接数据的url后面配置这句话:
            ?rewriteBatchedStatements=true
    3.批量插入数据使用的jdbc.jar必须实在5.7版本以上才支持
     */
    @Test
    public void  testInsertInfo2()  {
        Connection conn = null;
        PreparedStatement pst = null;
        String sql = "insert into user_tab(id,name) values(?,?)";
        try{
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            pst = conn.prepareStatement(sql);
            for (int i = 1; i <=20000 ; i++) {
                pst.setObject(1,i);
                pst.setObject(2,"name"+i);
                //1,添加batch
                pst.addBatch();
                //2.执行batch()
                if (i % 500 == 0){
                    pst.executeBatch();
                    //清空batch
                    pst.clearBatch();
                }
            }
            long end = System.currentTimeMillis();
            System.out.println("采用batch插入20000条数据花费时间为:"+ (end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {

        }

    }

Cuatro. Cambiar el tiempo de envío para controlar el número de envíos para mejorar la eficiencia

 public void testInsertInfo3(){
        Connection conn = null;
        PreparedStatement pst = null;
        String sql = "insert into user_tab(id ,name) values(?,?)";
        try {
            long start = System.currentTimeMillis();
            conn = JDBCUtils.getConnection();
            conn.setAutoCommit(false);
            pst = conn.prepareStatement(sql);
            for (int i = 1; i <= 200000; i++) {
                pst.setObject(1,i);
                pst.setObject(2,"name"+i);
                //添加缓存
                pst.addBatch();
                if(i % 500 == 0){
                    //执行缓存
                    pst.executeBatch();
                    //清空缓存
                    pst.clearBatch();
                }
            }
            conn.commit();
            long end = System.currentTimeMillis();
            System.out.println("采用设置不允许自动提交的方式的花费的时间:"+(end - start));
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            JDBCUtils.closeResource(conn,pst);
        }
    }


Supongo que te gusta

Origin blog.csdn.net/qq_52655865/article/details/123975787
Recomendado
Clasificación