我有一个使用静态初始化块建立与数据库连接的类。该类有许多公共静态方法用于查询数据库。我想在程序终止前执行一个静态块来正确关闭这个连接,就像在try/catch中的finally块一样。我几乎可以确定在Java中不存在这样的机制。那么,我的最佳选择是每次查询时都打开和关闭连接吗?
public static void main(String[] args) {
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
public void run() {
//code to close connection
}
}, "Shutdown-thread"));
}
public class JdbcDBManager {
private Connection connection = null;
private PreparedStatement preparedStatement = null;
private ResultSet resultSet = null;
public JdbcDBManager(String url, String user, String pass) throws ClassNotFoundException, SQLException {
Class.forName("org.gjt.mm.mysql.Driver");
this.connection = DriverManager.getConnection(url, user, pass);
}
public void close() {
try {if (this.preparedStatement != null)this.preparedStatement.close();} catch (Exception e) {e.printStackTrace();}
try {if (this.resultSet != null)this.resultSet.close();} catch (Exception e) {e.printStackTrace();}
try {if (this.connection != null)this.connection.close();} catch (Exception e) {e.printStackTrace();}
}
public void customerInsert(Customer customer) {
try {
String query = "INSERT INTO customer(email,product) VALUES(?,?,?,?,?)";
this.preparedStatement = this.connection.prepareStatement(query);
this.preparedStatement.setString(1, customer.getEmail());
this.preparedStatement.setString(3, customer.getProduct());
} catch (Exception e) { e.printStackTrace();}
}}
public class test {
public static void process() throws ClassNotFoundException, SQLException {
JdbcDBManager customerDB = new JdbcDBManager(JdbcURL.URL, JdbcURL.USER, JdbcURL.PASS);
try {
customerDB.insertCustomer(Customer customer);
doSomething(customerDB); // Pass db object as a parameter
} finally { customerDB.close();} // close it when you are finally done
}
doSomething(JdbcDBManager customerDB){
---------------------------
--process info in db-------
} }
我最好的选择是在每个查询中打开和关闭连接吗? 答案:不是
我建议您遵循以下步骤:
使用单例类
打开连接,类似于这样:
public class connectDB {
static Connection conn = null;
public static Connection getConnection(){
if (conn != null) return conn;
String connString = "DATABASE ACCESS URL HERE";
return getConnection(connString);
}
private static Connection getConnection(String conString){
try{
Class.forName("LOAD DRIVER HERE");
String uname = "DB USERNAME";
String pass = "DB PASSWORD";
conn = DriverManager.getConnection(conString, uname, pass);
}
catch(Exception e){
//Handle Exceptions
e.printStackTrace(); //<--Retrieves the error/Exception for you
}
return conn;
}
}
并使用类似以下的方式关闭连接:
public static void closeConnection(Connection conn) {
try {
conn.close();
}
catch (SQLException e) {
//Handle Exception Here
}
}
只需调用 conn = connectDB.getConnection()
来进行连接,另一个用于关闭连接,最好在 finally
语句块中执行。
Connection
实例,并在使用完后关闭它们,或者使用某种连接池。 - MadProgrammersingleton
,为每个数据库打开一次连接,在完成所有操作后,只需调用一个处理语句、结果集和连接的dispose-off方法。 - mustangDC