关闭使用单例框架的{java}应用程序中的连接

时间:2015-06-08 17:07:06

标签: java swing singleton database-connection

我正在使用SwingGUI创建一个java应用程序。我已经为帧使用了单例类(以避免创建多个帧)。此外,该类使用数据库连接。现在,在应用程序(HomeScreen)的开头,我创建并初始化了数据库连接,并在应用程序关闭时关闭它。但是,每次我需要访问数据库时,DB语句都是在类中私有创建的(类就像是表单到条目信息)。在我使用语句进行数据库操作之后,我关闭它以及表单。现在当我重新打开表单(没有重新启动应用程序),并尝试在表单中输入值时,我显示错误:

Error executing insert query  !!!
No operations allowed after statement closed.

这是显而易见的,因为表单框架是单例类,一旦连接关闭,它就不会重新建立(不会调用构造函数)。

HomeScreen(应用程序的主页)

public class HomeScreen extends javax.swing.JFrame {

private static HomeScreen _instance;
/**
 * Creates new form HomeScreen
 */
private HomeScreen() {
    initComponents();
    showMessageOnAppClose();

    dbc = new DBConnection();
    dbc.init();
    dbConn = dbc.getMyConnection();
}

public static HomeScreen getInstance(){
    if (_instance == null){
        _instance = new HomeScreen();
    }
    return _instance;
}

形式:

public class StudentMemberRegist extends javax.swing.JFrame {

private static StudentMemberRegist _instance;

/**
 * Creates new form StudentMemberRegist
 */
private StudentMemberRegist() {
    initComponents();
    Util.showMessageOnWindowClose(this);

    try {
        stmt = HomeScreen.dbConn.createStatement();
    } catch (SQLException e) {

    }

    setFormValues();
}

public static StudentMemberRegist getInstance() {
    if (_instance == null) {
        _instance = new StudentMemberRegist();
    }

    return _instance;
}

DBConnection类

public class DBConnection {
private Connection dbConnection;

/** Creates new instance of DBConnection */
public DBConnection(){

}

public void init(){

   try{

    Class.forName("com.mysql.jdbc.Driver");
       dbConnection = DriverManager.getConnection(
               "jdbc:mysql://localhost:3306/LibManagement", "root", "ace");
    }
    catch(Exception e){
        System.out.println("Failed to get connection <class:DBConnection>");
        e.printStackTrace();
    }
}

public Connection getMyConnection() {
    return dbConnection;
}

public void close(Statement stmt) {

    if (stmt != null) {
        try {
            stmt.close();
        } catch (Exception e) {
        }

    }
}

public void destroy() {

    if (dbConnection != null) {

        try {
            dbConnection.close();
        } catch (Exception e) {
        }

    }
}

现在,我面临着从未关闭数据库语句(stmt)或创建公共静态语句,在整个过程中使用它并在应用程序退出时关闭它的困境。不关闭声明可能不是一种选择。此外,使用静态语句将难以管理。帮帮我吧!

1 个答案:

答案 0 :(得分:0)

您不应该使用数据库连接作为单例类中的属性。这是一个糟糕的设计。根据定义,作为GUI元素的单例甚至不应该关注数据库连接。

您应该做的是拥有一个可由您的单身人士调用的CRUDManager类(用于数据库创建/读取/更新/删除)。如CRUD所示,这将有4种公共方法。并且它应该在需要时处理它自己的连接(并在事务完成时关闭它们,不要在应用程序范围内保持连接打开!)。这应该对GUI透明。