Java学习

java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已经搬家了,新的地址是 http://www.javaly.cn 如果有对文章有任何疑问或者有任何不懂的地方,欢迎到www.javaly.cn (Java乐园)指出,我会尽力帮助解决。一起进步

 

JDBC 查询数据库已经事物处理

一套系统已做完了,结果发现了一个重大漏洞,没做连接的事务处理.  
  比如说几个INSERT.UPDATE一起,如果最后一个UPDATE出了问题,要将前面的INSERT.UPDATE都回滚回来.  
   
  我现在用的是TOMCAT服务器,不支持事务处理.数据库用ORALCE.我知道可以setautocommit(false).rollback()来 处理,但这样的话,改动量太大了(因为我有一个BEAN做数据库的连接和增改查删等操作),请问各位有没有比较快的方式将所有JSP改过来?  
   
  原有代码如下:  
   
  =======================================  
   
  package   db;  
   
  import   javax.naming.*;  
  import   javax.sql.*;  
  import   java.sql.*;  
  import   java.text.SimpleDateFormat;  
  import   java.util.Date;  
   
  public   class   DataBean{  
      java.sql.Connection   conn   =   null;  
      PreparedStatement   ps   =   null;  
      ResultSet   rs   =   null;  
   
      public   DataBean(){  
          try{  
              Class.forName("oracle.jdbc.driver.OracleDriver");  
              conn   =   DriverManager.getConnection("jdbc:oracle:thin:@10.100.11.252:1521:proc","changchun","changchun");  
              conn.setAutoCommit(true);  
          }catch(Exception   e){  
              e.printStackTrace();  
          }  
      }  
   
      public   ResultSet   select(String   entity,String   prec){  
          try{  
              ResultSet   rs   =   null;  
              ps   =   conn.prepareStatement("select   "+entity+"   from   "+prec);  
              rs   =   ps.executeQuery();  
              conn.rollback();  
              return   rs;  
          }catch(Exception   e){  
              System.out.println(e);  
              return   null;  
          }  
      }  
   
      public   ResultSet   newselect(String   entity,String   prec){  
          try{  
              ResultSet   rs   =   null;  
              ps   =   conn.prepareStatement("select   "+entity+"   from   "+prec,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);  
              rs   =   ps.executeQuery();  
              conn.rollback();  
              return   rs;  
          }catch(Exception   e){  
              System.out.println(e);  
              return   null;  
          }  
      }  
   
      public   void   insert(String   value,String   prec){  
          try{  
              ps   =   conn.prepareStatement("insert   into   "+prec+"   values   "+value);  
              ps.executeUpdate();  
              conn.rollback();  
              }catch(Exception   e){System.out.println(e);}  
      }  
   
      public   void   delete(String   sql){  
          try{  
              ps   =   conn.prepareStatement(sql);  
              ps.executeUpdate();  
              conn.rollback();  
              }catch(Exception   e){System.out.println(e);}  
      }  
   
      public   void   update(String   table,String   prec){  
          try{  
              ps   =   conn.prepareStatement("update   "+table+prec);  
              ps.executeUpdate();  
              conn.rollback();  
              }catch(Exception   e){System.out.println(e);}  
      }  
   
      public   static   boolean   validateDate(String   vDate)   {  
                      SimpleDateFormat   dateFormat   =   new   SimpleDateFormat();  
                      try   {  
                              dateFormat.applyPattern("yyyy-MM-dd");  
                              dateFormat.setLenient(false);  
                              Date   date   =   dateFormat.parse(vDate);  
                              return   true;  
                      }   catch   (Exception   e)   {  
                              return   false;  
                      }  
              }  
   
   
      public   void   close(){  
          try{  
   
              ps.close();  
              conn.close();  
              }catch(Exception   e){System.out.println(e);}  
      }  
   
  }  
  ===========================  
  提出一些小建议也有分.解决问题后给500分!!!  
  谢谢!!!



########################################
首先你上面的代码有问题,conn.rollback()怎么在数据库操作后呢,如果此时conn.setAutoCommit(false);那么你什么也没作,操作完数据库就回滚,呵呵.  
   
  首先使用事务你必须先把构造函数中的conn.setAutoCommit(true);改为  
  conn.setAutoCommit(false);  
  如何想把异常都抛到jsp里,以下面的方法为例,  
    public   void   insert(String   value,String   prec){  
          try{  
              ps   =   conn.prepareStatement("insert   into   "+prec+"   values   "+value);  
              ps.executeUpdate();  
              conn.rollback();  
              }catch(Exception   e){System.out.println(e);}  
      }  
  可以这样写  
   
  public   void   insert(String   value,String   prec)   throws   Exception    
  {  
          try{  
              ps   =   conn.prepareStatement("insert   into   "+prec+"   values   "+value);  
              ps.executeUpdate();  
              }catch(Exception   e)  
              {  
              throw   e;  
              }  
               
  }  
  这样所有的Excepion就抛到你的jsp里了  
  在jsp里你这样写  
      DataBean   oTest   =   null;  
      try  
      {  
      oTest   =   new   DataBean();  
       
      //此处加入你操作数据库的方法  
       
      oTest.conn.commit();  
      oTest.conn.close();  
      }catch(Exception   e)  
      {  
      e.printStackTrace();  
      try{  
      oTest.conn.rollback();  
      }catch(Exception   ee)  
      {  
   
      }  
      }finally  
      {  
      try  
      {  
      if(oTest.conn!=null)  
      oTest.conn.close();  
      }catch(Exception   e)  
      {  
   
      }  
      }  

##############################################


转:http://topic.csdn.net/t/20030519/12/1803615.html

posted on 2009-07-09 09:37 找个美女做老婆 阅读(541) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问  
 

导航

统计

公告

本blog已经搬到新家了, 新家:www.javaly.cn
 http://www.javaly.cn

常用链接

留言簿(6)

随笔档案

文章档案

搜索

最新评论

阅读排行榜

评论排行榜