关闭 java 应用程序中使用单例框架的连接
Closing connections in java application which uses singleton frames
我正在使用 SwingGUI 创建一个 java 应用程序。我对框架使用单例 classes(以避免创建多个框架)。此外,class 使用数据库连接。现在,在应用程序 (HomeScreen) 开始时,我已经创建并初始化了数据库连接,并在应用程序关闭时将其关闭。但是,每次我需要访问数据库时,数据库语句都是在 classes 中私下创建的(class 就像输入信息的表单)。在我使用语句进行数据库操作后,我将它和表单一起关闭。现在,当我重新打开表单(不重新启动应用程序)并尝试在表单中输入值时,会显示错误:
Error executing insert query !!!
No operations allowed after statement closed.
这很明显,因为表单框架是单例 class 并且一旦关闭连接就不会重新建立(不会调用构造函数)。
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 class
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) 或创建一个 public 静态语句,始终使用它,并在应用程序退出时关闭它的困境。不关闭语句可能不是一种选择。此外,使用静态语句将难以自始至终进行管理。帮帮我!
您不应将数据库连接用作单例中的属性 class。这是糟糕的设计。根据定义,作为 GUI 元素的单身人士根本不应该关心数据库连接。
你应该做的是有一个 CRUDManager class(用于数据库 create/read/update/delete),它可以被你的单例调用。正如 CRUD 所建议的,这将有 4 个 publics 方法。它应该在需要时处理它自己的连接(并在事务完成时关闭它们,不要在应用程序范围内保持连接打开!)。这对 GUI 应该是透明的。
我正在使用 SwingGUI 创建一个 java 应用程序。我对框架使用单例 classes(以避免创建多个框架)。此外,class 使用数据库连接。现在,在应用程序 (HomeScreen) 开始时,我已经创建并初始化了数据库连接,并在应用程序关闭时将其关闭。但是,每次我需要访问数据库时,数据库语句都是在 classes 中私下创建的(class 就像输入信息的表单)。在我使用语句进行数据库操作后,我将它和表单一起关闭。现在,当我重新打开表单(不重新启动应用程序)并尝试在表单中输入值时,会显示错误:
Error executing insert query !!!
No operations allowed after statement closed.
这很明显,因为表单框架是单例 class 并且一旦关闭连接就不会重新建立(不会调用构造函数)。
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 class
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) 或创建一个 public 静态语句,始终使用它,并在应用程序退出时关闭它的困境。不关闭语句可能不是一种选择。此外,使用静态语句将难以自始至终进行管理。帮帮我!
您不应将数据库连接用作单例中的属性 class。这是糟糕的设计。根据定义,作为 GUI 元素的单身人士根本不应该关心数据库连接。
你应该做的是有一个 CRUDManager class(用于数据库 create/read/update/delete),它可以被你的单例调用。正如 CRUD 所建议的,这将有 4 个 publics 方法。它应该在需要时处理它自己的连接(并在事务完成时关闭它们,不要在应用程序范围内保持连接打开!)。这对 GUI 应该是透明的。