首页 > 其他分享 > JDBC之常规插入,Statement和PreparedStatement批处理时间问题

JDBC之常规插入,Statement和PreparedStatement批处理时间问题

时间:2023-08-14 18:06:03浏览次数:42  
标签:JDBC PreparedStatement SQLException static pst Statement close null conn

已经封装好的通用的批处理语句:

import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.*; import java.util.Properties;

/**

  • 是一个工具类:
  • 作用:用于封装通用的获取连接、通用的增删改、通用的查询
  • 版本:v0.0.0.1
  • 方法:getConn();
  •   close();
    
  • 问题:
  •  OCP:对扩展开放,对修改的关闭;
    
  •  现在数据库myjdbc,该库名,修改代码;用户 名 密码要改,也需要修改代码.
    
  • 升级:
  •  需要读取到db.properties的文件的内容;
    
  •  需要的技术:io
    
  •            Properties集合类;
    

*/ public class JDBCUtilTwo { //成员变量; static Properties prop=new Properties(); static String className=null; static String url=null; static String uname=null; static String pwd=null; //1.静态代码块,加载数据库的驱动,此处是mysql驱动; static { try { FileReader reader=new FileReader("db.properties"); prop.load(reader); //getProperty():获取的从文件读取的key; className=prop.getProperty("className"); url=prop.getProperty("url"); uname=prop.getProperty("uname"); pwd=prop.getProperty("pwd");

        Class.forName(className);
    } catch (ClassNotFoundException | FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
//2.获取链接;获取一个连接对象;
public static Connection getConn(){
    Connection connection = null;
    try {
        connection = DriverManager.getConnection(url, uname, pwd);
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return connection;
}
//3.关闭对象,结果集对象、语句对象、链接对象;
public static void close(ResultSet rs, Statement st, Connection conn){
    if(rs!=null) {
        try {
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if(st!=null)
        try {
            st.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    if(conn!=null)
        try {
            conn.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
}

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79

普通插入方式,耗时比较长:

/** * 执行时间:23 9786毫秒 * @throws SQLException */ @Test public void test021() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); //常规语句对象+普通方式 Statement st = conn.createStatement(); //1万条数据; long startTime=System.currentTimeMillis(); for (int i = 5; i < 10005; i++) { String sql="insert t_user(username,passworld)values('tom','tom')"; st.executeUpdate(sql); }

    st.close();
    conn.close();
    long endTime=System.currentTimeMillis();

    System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

Statement方式添加批处理,时间还比较慢。

/** * 使用批处理来进行操作; * 执行时间:21 4194毫秒 2468毫秒 * @throws SQLException */ @Test public void test022() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); //设置链接,自动提交事务为false。 conn.setAutoCommit(false); //常规语句对象+普通方式 Statement st = conn.createStatement(); //1万条数据; String sql="insert t_user(username,passworld)values('tom','tom')";

    long startTime=System.currentTimeMillis();
    for (int i = 1; i <10010 ; i++) {
        //将sql语句,添加到批处理里面;
        st.addBatch(sql);
        //在某个时间节点,执行一次批处理;
        if(i%2000==0) {
            st.executeBatch();      //执行批处理
            st.clearBatch();        //清空一下批处理;
        }
    }
    st.executeBatch();      //执行批处理
    st.clearBatch();        //清空一下批处理;

    //提交事务;
    conn.commit();

    JDBCUtilTwo.close(null,st,conn);

    long endTime=System.currentTimeMillis();
    System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

时间还比较慢:可以在配置文件,修改mysql批处理为true。

className=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/myjdbc?rewriteBatchedStatements=true uname=root pwd=root

1
2
3
4

再修改事务自动提交为false,会大幅度提交效率。

预编译语句方式,批处理:

/** * 执行时间:22 0170毫秒 1711毫秒 * @throws SQLException */ @Test public void test023() throws SQLException { Connection conn = JDBCUtilTwo.getConn(); String sql="insert t_user(username,passworld)values(?,?)"; PreparedStatement pst = conn.prepareStatement(sql);

    long startTime=System.currentTimeMillis();

    for (int i = 2; i < 10002; i++) {
        pst.setString(1,"u"+i);
        pst.setString(2,"p"+i);
        //添加到批处理里面;
        pst.addBatch();
        if(i%2000==0){
            pst.executeBatch();
            pst.clearBatch();
        }
    }
    pst.executeBatch();
    pst.clearBatch();

    JDBCUtilTwo.close(null,pst,conn);
    long endTime=System.currentTimeMillis();
    System.out.println("执行时间:"+(endTime-startTime)+"毫秒");
}

————————————————

标签:JDBC,PreparedStatement,SQLException,static,pst,Statement,close,null,conn
From: https://blog.51cto.com/teayear/7079362

相关文章

  • springjdbc处理nvarchar
    当我们使用spring-jdbc来做持久化时(注意不是spring-data-jbc),有时候一些特殊字符存入数据库时会用到nvarchar、nvarchar2这种类型(比如存放化学式,如CO₂等),默认会直接按照String类型来处理字段类型映射,如果要最终让使用ps.setNString这种,一般有几种办法。当使用JdbcTemplate时,可以......
  • java.sql.SQLFeatureNotSupportedException: 这个 org.postgresql.jdbc.PgResultSet.g
    具体报错为:Errorattemptingtogetcolumn'DISEASENAME'fromresultset.Cause:java.sql.SQLFeatureNotSupportedException:这个org.postgresql.jdbc.PgResultSet.getNString(int)方法尚未被实作。;这个org.postgresql.jdbc.PgResultSet.getNString(int)方法尚未被实......
  • 对jdbctemplate的再次简单封装
    JdbcTemplateRepository.javaimportorg.slf4j.Logger;importorg.slf4j.LoggerFactory;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.jdbc.core.BatchPreparedStatementSetter;importorg.springframework.jdbc.core.Bea......
  • The MySQL server is running with the LOCK_WRITE_GROWTH option so it cannot execu
    然后百度参考:TheMySQLserverisrunningwiththeLOCK_WRITE_GROWTHoptionsoitcannotexecutethisstatement_冰尘s1的博客-CSDN博客mysql报错TheMySQLserverisrunningwiththeLOCK_WRITE_GROWTHoptionsoitcannotexecutethisstatem_言默夜雨的博客-CSDN博客......
  • Connect to Dababase using JDBC in JSP
    jsp连接数据库大全现在有好多初学jsp的网友经常会问数据库怎么连接啊,怎么老出错啊?所以我集中的在这写篇文章供大家参考,其实这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学者学习,所以我就这样做了,当大家学到一定程度的时候,可以考虑用MVC的模式开发。在练习这些代码的......
  • Spring Boot集成Sharding JDBC分库分表
    背景近期公司购物车项目需要使用ShardingJDBC分表,特记录下。ps:未分库依赖引入<!--sharding-sphereVersion:4.1.1--><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><ver......
  • mysql Statement接口
    Statement接口是Java执行数据库操作的一个重要接口,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句。java.sql.Statement接口用于执行静态的SQL语句并返回执行结果。在默认情况下,同一时间每个Statement接口只能打开一个ResultSet对象。因此,如果读取一个ResultSet......
  • JDBC的超时时间和常用配置
    案例:2019年在对数据库中间件ProxySQL滚动升级时,另一台虚机意外重启导致ProxySQL服务不可用,上层服务出现大量异常访问慢的情况的,通过jstack分析线程情况发现业务系统停止在JDBC的调用上,日志中大量的waiting状态的线程;导致服务长时间处于不可以用的状态,后经过重启服务解决问题;为什......
  • 记录:jdbc调用sqlserver存储过程
    1、现场为内网环境,不利于测试2、调用sqlserver存储过程,报错:为过程或函数**指定了过多的参数一、制作本地sqlserver环境1、docker安装sqlserver#获取镜像dockerpullmcr.microsoft.com/azure-sql-edge#启动账号:sa密码:Password@dockerrun-e'ACCEPT_EU......
  • hadoop组件---数据仓库(五)---通过JDBC连接hive的thrift或者hiveserver2
    我们在上一篇文章中已经学习了Hive的常用命令,但是如果使用其他的语言如何跟Hive进行交互呢。Thrift简介Hive拥有HiveServer(Thrift)或者Hiveserver2组件,提供了JDBC驱动服务,使得我们可以用Java代码或者Python来连接Hive并进行一些关系型数据库的sql语句查询等操作。HiveServer或者Hi......