这个类是唯一应该访问数据库的东西,我想在应用程序启动时给它一个连接对象。但是,实例化可能会导致抛出异常,所以我不能这样做:
public class DBManager {
private static Connection conn = Database.getReadOnlyConnection();
...
...
}
我有一个非常丑陋的解决方法,我想知道是否有更好的方法。
public class DBManager {
private static Connection conn = null;
private static DBManager instance = null;
public static DBManager getInstance() throws SQLException, ClassNotFoundException {
if (instance == null){
instance = new DBManager();
}
return instance;
}
private DBManager() throws SQLException, ClassNotFoundException {
conn = Database.getReadOnlyConnection();
}
...
...
}
还有另一种选择:
public class DBManager {
private static Connection conn = null;
public static void setConnection(Connection conn) throws NotSupportedException{
if (conn == null){
this.conn = conn;
}
else {
throw new NotSupportedException();
}
}
...
...
}
在Java中处理这个有更好的方法吗?
更新
我决定使用静态初始化程序块。
public class DBManager {
private static Connection conn;
static {
try {
conn = getReadOnlyConnection();
} catch (Exception e) {
e.printStackTrace();
System.exit(1);
}
}
...
...
}
如果无法访问数据库,则会导致应用程序提前失败,并避免必须确保仅通过实例使用DBManager的问题。
答案 0 :(得分:0)
您的程序应该更加健壮 - 确保您现在可以建立连接,但如果数据库关闭会发生什么 - 使用与no DB now
相同的逻辑DB goes down later
答案 1 :(得分:0)
如何使用静态方法并检查连接是否仍然有效,
public class Config{
private static Connection con;
private String dbUrl = "jdbc:mysql:/localhost:3306/dbname","username","password";
public static Connection getConnection() throws SQLException{
if(con== null){
con = DriverManager.getConnection(dbUrl);
}
if(!con.isValid(10)){
con = DriverManager.getConnection.getConnection(dbUrl);
}
return con;
}
}