一套系統(tǒng)已做完了,結(jié)果發(fā)現(xiàn)了一個(gè)重大漏洞,沒做連接的事務(wù)處理.
比如說(shuō)幾個(gè)INSERT.UPDATE一起,如果最后一個(gè)UPDATE出了問(wèn)題,要將前面的INSERT.UPDATE都回滾回來(lái).
我現(xiàn)在用的是TOMCAT服務(wù)器,不支持事務(wù)處理.數(shù)據(jù)庫(kù)用ORALCE.我知道可以setautocommit(false).rollback()來(lái)
處理,但這樣的話,改動(dòng)量太大了(因?yàn)槲矣幸粋€(gè)BEAN做數(shù)據(jù)庫(kù)的連接和增改查刪等操作),請(qǐng)問(wèn)各位有沒有比較快的方式將所有JSP改過(guò)來(lái)?
原有代碼如下:
=======================================
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);}
}
}
===========================
提出一些小建議也有分.解決問(wèn)題后給500分!!!
謝謝!!!
########################################
首先你上面的代碼有問(wèn)題,conn.rollback()怎么在數(shù)據(jù)庫(kù)操作后呢,如果此時(shí)conn.setAutoCommit(false);那么你什么也沒作,操作完數(shù)據(jù)庫(kù)就回滾,呵呵.
首先使用事務(wù)你必須先把構(gòu)造函數(shù)中的conn.setAutoCommit(true);改為
conn.setAutoCommit(false);
如何想把異常都拋到j(luò)sp里,以下面的方法為例,
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();
//此處加入你操作數(shù)據(jù)庫(kù)的方法
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)
{
}
}
##############################################
轉(zhuǎn):http://topic.csdn.net/t/20030519/12/1803615.html