[英]JDBC Connection object automatically closes after the static block is executed and how to modularize the code
我有一個正在調用數據庫類以將條目添加到數據庫的類。 問題是,每當我向數據庫中添加元組時,都必須創建一個新的Connection和Statement對象。
我想解決的一個辦法是將Connection和Statement對象的初始化放在一個靜態塊中。 並直接運行命令statement.executeUpdate(sqlStatement)。
但這會產生一個錯誤,即未初始化Connection對象。
的代碼如下:
class Database{
static final String JDBC_DRIVER = "....";
static final String DB_URL = "...";
static final String USER = ".....";
static final String PASS = ".....";
static Connection conn = null; // Connection object for creating a connection with the Database
static Statement stmt = null; // Statement object to run queries on first table in Database
static{
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(DB_URL,USER,PASS);
stmt = conn.createStatement();
}catch(SQLException se){
se.printStackTrace();
}catch(Exception e){ //Handle errors for Class.forName
e.printStackTrace();
}finally{ //finally block used to close resources
try{
if(stmt!=null){
stmt.close();
}
}catch(SQLException se2){
System.out.println("caught a SQLException " + se2 + " AND NOTHING CAN BE DONE ABOUT IT");
// nothing we can do
}
try{
if(conn!=null){
conn.close();
}
}catch(SQLException se){
se.printStackTrace();
}
}
}
public static void runSqlCommand(String command)throws java.lang.Exception{
stmt.executeUpdate(command); // This gives an error that connection is not initialized.
}
}
我想知道如何對代碼進行模塊化,這樣我就可以調用runSqlCommand函數並執行sql代碼,而不必每次都創建連接和語句。
還請告訴我,如果只對對象初始化一次而不對每個sql命令初始化一次,性能應提高多少?
您正在靜態初始化程序塊中打開連接,並在該塊的結尾處將其關閉,因此,每當您的類加載時,您總是會先初始化連接,然后再關閉連接,我認為您需要移出代碼您在finally塊中編寫的內容。
編譯器正確地告訴您,存在一條執行路徑,不會通過該執行路徑初始化“ stmt”,即是否存在打開連接的異常。
但是無論如何,當您仔細關閉靜態塊中的語句和連接時,整個練習首先是毫無意義的。
我建議一個連接池,並在實際需要時打開和關閉連接。 這比嘗試在整個過程的生命周期中保持打開單個連接的健壯性要強得多,並且比試圖整天捆綁單個連接對數據庫的友好性要強得多。
如果要模塊化代碼,則將連接管理代碼分離到其他一些文件中,例如可以使用DAO模式,從中獲取初始化的連接,完成后,通過DAO幫助器方法關閉連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.