我有一个调用数据库类的类来向数据库添加条目。问题是每当我向数据库添加元组时,我都必须创建一个新的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命令,那么性能应该提高多少。
答案 0 :(得分:2)
您正在打开静态初始化程序块中的连接,并且在块结束时关闭它,因此无论何时加载类,您都将初始化连接,然后关闭,我认为您需要移动你在finally块中写的代码。
答案 1 :(得分:1)
编译器正确告诉您存在执行路径,通过该路径' stmt'没有初始化,即如果你打开连接的异常。
但无论如何,当你在静态区块中小心地关闭语句和连接时,整个练习首先是毫无意义的。
我建议使用连接池,并在实际需要时打开和关闭连接。比尝试在流程的生命周期中保持单个连接打开要强大得多,并且比试图整天连接单个连接更加耐用于数据库。
答案 2 :(得分:1)
如果要模块化代码,请将连接管理代码与其他文件分开,例如可以使用DAO模式,从中获取初始化连接,完成后,通过DAO帮助程序关闭连接方法