Java中的静态块
我有一个类,它使用Java中的静态块,java,Java,我有一个类,它使用静态初始化块来建立到数据库的连接。该类有许多查询数据库的公共静态方法。我想在程序终止前执行的静态块中正确关闭此连接,有点像try/catch中的finally块。我几乎可以肯定Java中不存在这样的东西。打开和关闭每个查询的连接的最佳选项是什么?请查看以下内容: 您可以尝试编写代码来关闭此方法中的连接 public static void main(String[] args) { Runtime.getRuntime().addShutdownHook(new Thr
静态
初始化块来建立到数据库的连接。该类有许多查询数据库的公共静态方法。我想在程序终止前执行的静态
块中正确关闭此连接,有点像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"));
}
打开和关闭每个查询的连接将导致系统额外的开销,使应用程序运行缓慢
您可以用try-catch块代替DB程序的最终查询,并释放finally子句中的连接(用于程序的最后一次查询)
注意:如果JVM在主线程完成执行之前终止,即System.exit()执行,则后续代码和finally块将不会执行。我打开和关闭与每个查询的连接的最佳选项是什么?
回答:没有
我建议你遵循:
Singleton类
用于打开连接,如下所示:
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;
}
}
就打电话
conn=connectDB.getConnection()
用于连接,另一个用于关闭,最好在最后一个
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-------
} }
通过这种方式,您可以打开连接一次,并在过程最终完成时关闭连接您需要发布代码的可能副本。但一般来说,静态连接变量一旦初始化,在应用程序的整个生命周期内都将保持可用。可能是关机挂钩的重复。只有通过关机挂钩,您才“可能”知道JVM何时关机,但是,这假设正常关机已经发生。一般来说,更好的解决方案可能是根据需要创建连接的短期实例,并在完成后关闭它们,或者使用某种类型的连接池。当应用程序正常退出时,上述代码可以正常工作。如果虚拟机中止,则无法保证是否会运行任何关闭挂钩。问题是我打开和关闭每个查询的连接的最佳选择是什么?如果查询太多,则打开和关闭每个查询的连接并不好。它会增加您的代码行,并导致不必要的开销。使用shutDownHook可以减少这一切。。
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-------
} }