一套系统已做完了,结果发现了一个重大漏洞,没做连接的事务处理.
比如说几个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