向数据库插入大量数据,会导致数据库效率降低。mysql单表最大插入量800万条。
批处理:将大量sql达成一个批,一次性发送到数据库执行的一门技术。
优势:
如果要有大量的sql语句到数据库执行,通过批处理可以减少发送的次数,提高程序的效率。
当需要向数据库插入大量数据时,如几个G的sql记录。
在没有使用批处理前,100条记录需要打开数据库连接和关闭数据库连接100次。
批处理可以将一部分sql达成一个批次addBatch()【1.把sql打成批】,统一【2.发送给数据库服务器】executeBatch(),当服务器受到sql后会依次打开批,执行批里的sql。操作数据库2次就可以了。
实现批处理:
1Statement对象实现
2PrepraredStatement对象实现
package batch;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import org.junit.Test;
import util.JDBCUtils;
/**
* 这个类用来完成jdbc的批处理
*/
public class BatchUse {
// 方式一
@Test
public void StatementImplement() {
Connection conn = null;
Statement st = null;
try {
// 1注册驱动 2获取数据库连接
conn = JDBCUtils.getConnection();
long start = System.currentTimeMillis();
// 3获取传输器
st = conn.createStatement();
// 4执行sql
for (int j = 1; j <= 100; j++) {
String sql = "insert into dept values(null,'" + j + "')";
//把sql达成批次
st.addBatch(sql);
}
//统一发送给数据库服务器
st.executeBatch();
long end=System.currentTimeMillis();
System.out.println(end-start);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.close(null, st, conn);
}
}
@Test
public void PreparedStatementImplement(){
Connection conn = null;
PreparedStatement ps = null;
try {
// 1注册驱动 2获取数据库连接
conn = JDBCUtils.getConnection();
long start = System.currentTimeMillis();
// 4执行sql
String sql = "insert into dept values(null,?)";//?是占位符,这句话是sql骨架
ps=conn.prepareStatement(sql);
for (int j = 1; j <= 100; j++) {
//把sql达成批次
ps.setString(1, j+"new");
ps.addBatch();
}
//统一发送给数据库服务器
ps.executeBatch();
long end=System.currentTimeMillis();
System.out.println(end-start);
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.close(null, ps, conn);
}
}
}