(1) 批处理:一个批次的数据库操作。这一个批次中可以包含任意条数的SQL语句。
(2) 业务场景:当需要向数据库发送一批SQL语句执行时,应避免向数据库一条条的发送执行,而应采用JDBC的批处理机制,以提升执行效率。
public class TestBatch {
@Test
public void testBatch() throws SQLException {
long start = System.currentTimeMillis();
Connection conn = JDBCUtil.getConnection();
String sql = "insert into t_batch(id,content) values (?,?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// 设置参数
for (int i = 1; i <= 1000; i++) {
pstmt.setString(1, "id_" + i);
pstmt.setString(2, "content_" + i);
//添加到批处理中,不执行数据库
pstmt.addBatch();
}
//执行批处理,执行数据库操作(一次)
int[] counts = pstmt.executeBatch();
long end = System.currentTimeMillis();
System.out.println(end - start);
System.out.println(counts.length);
}
}
JDBC – ThreadLocal
(1) ThreadLocal,叫做线程本地变量,也叫做线程本地存储。
(2) ThreadLocal在每个线程中对该变量会创建一个副本,即每个线程内部都会有一个该变量,且在线程内部任何地方都可以使用,线程之间互不影响,这样一来就不存在线程安全问题,也不会严重影响程序执行性能。
(3) ThreadLocal类提供的几个方法:
public T get() { } : 用来获取ThreadLocal在当前线程中保存的变量副本;
public void set(T value) { } :用来设置当前线程中变量的副本;
public void remove() { } :用来移除当前线程中变量的副本;
protected T initialValue() { } :一般是用来在使用时进行重写的,它是一个延迟加载方法。
//提供一个线程局部变量(私有、静态)
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
/**
* 获得数据库连接
* @return 连接对象
*/
public static Connection getConnection() {
Connection conn = null;
try {
//先在本地线程中获取连接对象
conn = threadLocal.get();
if(null == conn) {
//如果conn在本地线程局部变量中不存在,就创建conn
conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
//创建之后,将conn连接对象存入线程的局部变量中
threadLocal.set(conn);
}
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}