1. 程式人生 > >No operations allowed after connection closed. 解決辦法

No operations allowed after connection closed. 解決辦法

Java與資料庫(Mysql)打交道的時候,經常會出現一個錯誤:No operations allowed after connection closed.字面意思是:連線關閉後,不允許執行任何操作。

問題描述:struts2一個小專案中,要刪除使用者之前上傳的照片。上傳照片是通過上傳到資料庫中picture表(id,uid,name,url,這裡uid是使用者id,picture.id是自動增長)關於照片的相關資訊(沒有存放照片本身);和在伺服器上存放照片本身(copy)。所以在刪除資料庫時,就要刪除這兩個方面。

刪除資料庫中的資訊:直接在Action中呼叫DAO的方法刪除資料庫中照片的記錄

刪除伺服器上存放的照片檔案:其實就是找到照片檔案存放的目錄,刪除這個照片檔案。這裡需要得到絕對路徑(上傳照片時是傳入的相對路徑)。相對路徑可以在DAO中寫一個根據前端傳來的id值得到URL(相對路徑)的方法,在Action中呼叫DAO中的這個方法。

出現問題的程式碼:

//刪除照片
public String deletepic()
{
//刪除伺服器端上傳的照片檔案的方法
String path=dao.getUrlById(picture.getId());//第一次呼叫dao中方法
//獲取appliction物件,以獲取絕對路徑
ServletContext application= ServletActionContext.getServletContext();
path=application.getRealPath("")+path;
//封裝成一個File檔案,然後呼叫FileUtils中的方法去刪除該檔案
File myFile=new File(path);
FileUtils.deleteQuietly(myFile);

//刪除資料庫中記錄的方法
dao.deletepicture(picture.getId());//第二次呼叫DAO中的方法
return null;
}


原因:是因為在這個deletepic的方法中要做兩件事情:(兩次呼叫dao中的方法)
(1)刪除資料庫中關於照片的資訊記錄  要呼叫DAO中的deletepic方法,此時方法中的conn已經關閉
(2)刪除在伺服器中儲存著的照片檔案  要呼叫DAO中的getURl方法,此時沒有重新獲取conn,所以報錯。


解決:這就要求我們在編寫資料庫中方法時要注意程式碼的規範性。 一般每個方法都要先判斷是否關閉了共用的資料庫連線conn     if(conn.isClosed())
{
conn=DBlib.getconn();
}

然後在方法結尾關閉資料庫的連線 conn.close();

示例:DAO中方法根據id值刪除資料庫中記錄方法

//一、刪除照片在資料庫中記錄的方法
public void deletepicture(int id)
{
try {
if(conn.isClosed())
{
conn=DBLib.getConn();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
sql="delete from pictures where id=?";
try {
ps= conn.prepareStatement(sql);
ps.setInt(1, id);
ps.executeUpdate();
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}