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



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

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

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

主界面(应用的主页)

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),或者创建一个公共静态语句,始终使用它,并在应用程序退出时关闭它。不结束语句可能不是一种选择。另外,使用静态语句很难进行全程管理。帮帮我!

不应该在单例类中使用DB连接作为属性。这是糟糕的设计。根据定义,作为GUI元素的singleton根本不应该关心DB连接。

你应该做的是有一个CRUDManager类(用于数据库的创建/读取/更新/删除),可以由你的单例调用。这将有4个公共方法,如CRUD建议的那样。它应该在需要时处理自己的连接(并在事务完成时关闭它们,不要在应用程序范围内留下打开的连接!)

相关内容

  • 没有找到相关文章

最新更新