一套系統已做完了,結果發現了一個重大漏洞,沒做連接的事務處理.
比如說幾個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