应该如何初始化静态数据库连接?

时间:2013-12-04 05:06:17

标签: java singleton database-connection

这个类是唯一应该访问数据库的东西,我想在应用程序启动时给它一个连接对象。但是,实例化可能会导致抛出异常,所以我不能这样做:

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的问题。

2 个答案:

答案 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;
}
}
相关问题