[Site de test d'entretien de test écrit] La différence et le lien entre PreparedStatement et Statement && optimisation des données d'insertion par lots

teneur

1. La différence entre PreparedStatement et Statement to contact

1. Le lien entre l'état préparé et l'état :

2. Différence :

2. Optimisation progressive de l'insertion de données par lots dans les données

1. Utiliser la déclaration

2. Insérer à l'aide de PreparedStatement

3. Utilisez le cache de lot pour insérer

4. Modifier le moment de la soumission pour contrôler le nombre de soumissions afin d'améliorer l'efficacité


1. La différence entre PreparedStatement et Statement to contact

1. Le lien entre l'état préparé et l'état :

1. Ce sont toutes des interfaces de la classe d'emballage jdbc sous la société sun et n'appartiennent pas à des connexions externes ;

2.reparedStatement est une sous-interface de l'interface de déclaration ;

2. Différence :

1. PreparedStatement peut optimiser les performances du système. PreparedStatement précompile les instructions SQL et DBServer optimisera les performances des instructions SQL précompilées. Les instructions SQL précompilées peuvent être utilisées directement dans les insertions de lots ultérieures sans recompilation, ce qui peut améliorer les performances. vitesse de lecture et d'écriture

2. Dans l'instruction Statement, même si la même instruction SQL est utilisée, car le contenu inséré est différent, l'instruction SQL devra être compilée à nouveau, ce qui affectera la vitesse de lecture et d'écriture ;

3. PreparedStatement peut empêcher l'injection sql ;

4. L'utilisation de PreparedStatement peut insérer des données de fichier de flux BLob, mais Statement ne peut pas insérer de données Blob

5. L'utilisation des données de déclaration nécessite une chaîne, l'opération est lourde et il y a aussi une injection sql

2. Optimisation progressive de l'insertion de données par lots dans les données

1. Utiliser la déclaration

2. Insérer à l'aide de 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. Utilisez le cache de lot pour insérer

 //批量插入方式三:使用批处理插入
    /*
    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 {

        }

    }

4. Modifier le moment de la soumission pour contrôler le nombre de soumissions afin d'améliorer l'efficacité

 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);
        }
    }


Je suppose que tu aimes

Origine blog.csdn.net/qq_52655865/article/details/123975787
conseillé
Classement