JDBC会默认开启事务
事务开启
执行sql
关闭事务
事务开启
执行sql
提交事务
事务开启
执行sql
提交事务
。。。。。。。。。。
事务优化
事务开启
执行sql
执行sql
执行sql
。。。。
提交事务
所有sql放在一个事务里。
jdbc是默认开启事务管理的。
1000条sql就需要开启事务1000次,sql完成后,需要提交事务1000次。
获取数据库连接后
1.关闭jdbc自动管理事务
conn.setAutoCommit(false);
2.手动提交事务
conn.commit();
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 BatchUse2 {
// 方式一
@Test
public void StatementImplement() {
Connection conn = null;
Statement st = null;
try {
// 1注册驱动 2获取数据库连接
conn = JDBCUtils.getConnection();
long start = System.currentTimeMillis();
//关闭自动提交事务
conn.setAutoCommit(false);
// 3获取传输器
st = conn.createStatement();
// 4执行sql
for (int j = 1; j <= 1000; j++) {
String sql = "insert into dept values(null,'" + j + "')";
//把sql达成批次
st.addBatch(sql);
}
//统一发送给数据库服务器
st.executeBatch();
//手动提交事务
conn.commit();
long end=System.currentTimeMillis();
System.out.println("st"+(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();
conn.setAutoCommit(false);
// 4执行sql
String sql = "insert into dept values(null,?)";//?是占位符,这句话是sql骨架
ps=conn.prepareStatement(sql);
for (int j = 1; j <= 1000; j++) {
//把sql达成批次
ps.setString(1, j+"new");
ps.addBatch();
}
//统一发送给数据库服务器
ps.executeBatch();
conn.commit();
long end=System.currentTimeMillis();
System.out.println("ps"+(end-start));
} catch (SQLException e) {
e.printStackTrace();
}finally{
JDBCUtils.close(null, ps, conn);
}
}
}