欢迎投稿

今日深度:

oracle事务处理及实例演示jdbc操作批量删除,ora

oracle事务处理及实例演示jdbc操作批量删除,oraclejdbc


事务

        

       作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条sql语句来构成。当然还有针对非数据库操作的,如在计算机中设置的还原点即是一个很好的应用。

对于事务的基本性质在另一篇中有所叙述:SQL 事务及实例演示


 

oraclesql server在事务上区别


 

sql server中的事务一般分为隐式事务、显式事务、自动提交事务。


自动事务:对于sql server来说,当客户端提交一条sql语句时,这时候sql server都会自动启动一个事务;对于这样的事务,在执行完sql语句后会自动提交。


显示事务:这也是比较常见的使用的事务;其实实质上也就是在自动事务上,增加一个Begintranconn.commit,end tran.


隐式事务:相比显示事务需要开启connection,隐式事务是默认开启事务的Begin和数据库连接的。当然后面还是要进行commitrollback操作的。


       而oracle的事务就没有这么如此丰富了,和sql server的隐式事务类似;无需开启connBegin,只要在后续操作进行commitrollback操作。


 

事务提交的机制


 

      先了解一些基础的概念,data buffer cache:相当于一块连接硬盘文件和oracle数据操作的高速只读缓存。

SGA:在启动oracle实例后,在内存中开辟的一块内存空间,用于存放服务器的控制信息以及数据。

数据块:数据存储的基本单位。

当连接到数据库后,oracle为连接的用户创建独立的进程-影子进程,这个进程伴随用户的整个操作;


1.检查数据块

2.构造undo数据块

以此来回滚数据

3.生成redo日志

用于重新操作的日志存放在log buffer cache中。

4.lgwr进程启动,提交事务并书写所有日志文件


 

java事务处理


 

TestDemo:结合位于java.sql下面的接口 PreparedStatement和oracle事务实现批量删除


常用方法:

int[]executeBatch()

将一批命令提交给数据库来执行,如果全部命令执行成功,则返回更新计数组成的数组。

voidsetString(int parameterIndex,
               String x)

将指定参数设置为给定Java String 值。在将此值发送给数据库时,驱动程序将它转换成一个 SQL VARCHAR 或 LONGVARCHAR 值。

 

Demo

 

/**删除用户-2014年8月11日18:19:04
 * @userId 用户id数组
 */
publicBoolean DeleteUser(String[] userId){
//一个线程安全的可变字符串
StringBuffersb=new StringBuffer();
sb.append("deletefrom t_user where user_id =?");
Connectionconn=null;
PreparedStatementpsmt = null; 
Booleanflag=false;
 
conn=DButil.getConnection();
try {
//关闭自动提交事务
conn.setAutoCommit(false);
//创建一个 PreparedStatement 对象来将参数化的 SQL语句发送到数据库。
psmt= conn.prepareStatement(sb.toString());
//将一组参数添加到此 PreparedStatement 对象的批处理命令中。
for(inti =0 ;i<userId.length;i++){
psmt.setString(1,userId[i].trim());
psmt.addBatch();                                
}
 
  
   // 执行批量更新
   psmt.executeBatch();
   // 语句执行完毕,提交本事务
   conn.commit();
  
   flag=true;
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
try{
conn.rollback();
}catch (SQLException e1) {
//TODO Auto-generated catch block
e1.printStackTrace();
}
}
 
returnflag;
}
 


总结


     总的来说,感觉还是对oracle很多内部的机制了解的有限。前几天的设计模式讲课,也让想到这里的一些东西才有了这篇博客。只能说是非常浅显的认知,oracle在事务这里的处理相比在事务的处理上本质还是一致的。


用JDBC访问ORACLE数据库,做DELETE操作,可以用JAVA多线程实现? ORACLE服务器要怎配?

就像楼上说的。Oracle有自己的锁机制。就算你开100条线,它还是一条一条删除。不能同时删除多项的。
对于大量数据更新,Oracle有建议一些优化措施。
1. 首先是把auto-commit给关闭。因为你每删一条数据,oracle就要自动执行一次commit。commit是需要资源的。所以如果你手动设置为每删数据1000条,执行一次commit. 那你就可以节省资源了。
2. 充分利用batch update。如果不用batch,每个delete命令都需要从网络上传送到oracle。1万个删除命令,要有1万次传送。如果将100个删除命令绑在一起送去Oracle执行。那就只要传送100次就可以了。大大缩短所需时间和网络资源。
以上这些建议,都可以在Oracle参考里查到。
 

Oracle中事务的处理,比如要对表A操作,我先查询在更新,是否需要将查询放在事务,解答

按照你说的要求,查询不用放在事务里面,一般是在多个更新或删除的情况下才用到事务,并且“多个更新或删除”是要求原子性的,也就是要么都执行,要么都不执行。你说的这种情况,用不到事务,直接先查询再更新就行。首先查询是不会用到事务的,连续多个查询页不会用到事务,而第二步的更新,如果只涉及一个sql进行更新的话,也不会用事务(如果连续使用多个sql进行更新的话,需要用事务)。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2661.html NewsArticle oracle事务处理及实例演示jdbc操作批量删除,oraclejdbc 事务 作为逻辑处理的基本单位,对于数据库操作来说由一条或者多条 sql 语句来构成。当然还有针对非数据库操作的,如在计算机中...
评论暂时关闭