JDBC的批量处理
Statement的execute()等方法一次只能执行一条SQL语句,如果同时有多条SQL语句要执行的话,可以使用addBatch()方法将要执行的SQL语句执行进来,然后执行executeBatch()方法,这样就可以再一次方法中调用多条SQL语句,以提高执行效率。
为了保证这一批语句要么全部成功,要么全部失败,应该把批处理放置在事务中进行:
Try{
Conn.setAutoCommite(false);//把自动提交事务设置为false
Statement stm=conn.createStatement();
Stmt.addBatch(“…”);//添加SQL语句
….
Stmt.executeBatch();//执行批处理
}catch(SQLException e){
Try{
Conn.rollback();
}catch(SQLException e1){
E1.printStackTrace();
}
e.printStackTrack();
}finally{
Try{
Conn.setAutoCommit(true);//把自动提交事务设置为true
}catch(SQLException e){
e.printStackTrace();
}
//关闭资源
….
}
使用PreparedStatement也可以进行批处理:
Try{
//启动事务---把自动提交设置为false
Conn.setAutoCommit(false);
Pstmt=conn.prepareStatement(sql);
Pstmt.setXXX(1,…);//给占位符设置值
….
//把这些操作添加到批处理中
Pstmt.addBatch();
pstmt.setXXX(1,…);//给占位符设置值
//把这些操作添加到批处理中
Pstmt.addBatch();
pstmt.executeBatch();//执行批处理
//提交事务
Conn.commit();
}catch(SQLException e){
//回滚事务---把所有的操作都取消
Try{
Conn.rollback();
}catch(SQLException e1){
E1.printStackTrace();
}
e.printStackTrack();
}finally{
//关闭事务---把自动提交事务设置为true
Try{
Conn.setAutoCommit(true);
}catch(SQLException e){
e.printStackTrace();
}
//关闭资源
…
}
批处理中执行的语句只能是更新语句(insert 、delect、update),否则会抛出异常
数据库连接池
一、由于创建连接的代价是很高的,我们每次访问数据库都重新创建的话是非常消耗性的我们可以再程序启动的时候创建出一些连接,放在一个集合中,访问数据库的时候从集合中获取,使用结束再放回集合中。这样做只是在程序启动的时候消耗性能去创建连接,每次访问数据库的时候都是从内存中获取连接,可以大大提升效率。
注意事项:由于池中增删非常频繁,使用集合LinkedList、效率较高
集合中所有连接都被占用是创建连接,但需要注意连接总数
使用组合模式动态代理处理释放连接的方法,当运行close方法时,将连接放回池中
二、DataSoure概念
DataSource用来取代DriverManager来获取Connection;
通过DataSource获得Connection速度很快;
通过DataSource获得的Connection都是已经被包裹过的(不是驱动原来的连接)他的close方法已经被修改。