gpt4 book ai didi

java - 我的连接对象可以在我的所有表单上使用吗?

转载 作者:行者123 更新时间:2023-12-01 12:25:14 25 4
gpt4 key购买 nike

我正在使用 NetBeans 开发一个基于 Java 的应用程序。我的应用程序将打开一个窗口,要求用户输入凭据,并根据输入的数据,在应用程序和我的 MySQL 客户端之间建立连接(为此目的,我使用 JDBC)。

我的问题:我希望连接对象(在检查用户的凭据后声明并初始化)可在我的所有表单中使用。以前,我通过将连接对象从一种形式传递到另一种形式来做到这一点。但我不想那样做!我希望一旦声明此连接对象,它就可供应用程序中的所有表单使用。

最佳答案

I want the connection object (...) to be available for use in all my form

当您的应用程序运行时,您不应该有开放的连接。相反,请使用可用于所有应用程序的 1 或 2 个连接的数据库连接池,并添加一个关闭 Hook 以在应用程序完成时关闭此数据源。连接池将注意保持连接处于 Activity 状态并使用少量资源。

例如:您的用户打开应用程序并输入其凭据,然后离开房间,因为他/她必须做一些文书工作,需要 30 分钟,然后返回电脑并尝试使用某个选项。如果使用静态连接对象对象,您手动打开了到数据库的物理连接,并且您负责在这 30 分钟内控制连接,并且如果您不执行任何操作那时物理连接可能已被数据库引擎关闭。如果使用连接池,这将负责打开/关闭物理连接并将它们保持在 sleep 状态,这样您的连接就不会丢失。

请注意您的Connection对象和相关资源(PreparedStatementResultSet 等)。应该在尽可能窄的范围内。

<小时/>

这是使用 BoneCP 作为数据库连接池执行此操作的最小示例。

public class ConnectionProvider {
private static DataSource dataSource;
private static boolean initialized = false;

public static void init(Map<String, String> conf) {
if (!initialized) {
//synchronization to avoid multiple threads accesing to this part of the method
//at the "same time"
synchronized(DataSourceProvider.class) {
//double validation in case of multi threaded applications
if (!initialized) {
//you may add more validations here
//in case you want to use another datasource provider
//like C3PO, just change this part of the code
BoneCPDataSource bds = new BoneCPDataSource();
bds.setDriverClass(conf.get("driver"));
bds.setJdbcUrl(conf.get("url"));
bds.setUsername(conf.get("user"));
bds.setPassword(conf.get("password"));
//this should be obtained as configuration parameter
bds.setMaxConnectionsPerPartition(2);
//you can add more BoneCP specific database configurations
dataSource = bds;
initialized = true;
}
}
}
}

public static Connection getConnection() {
if (dataSource == null) {
//this should be a custom exception in your app
throw new RuntimeException("Data Source was not initialized.");
}
return dataSource.getConnection();
}
}

以及客户端(一旦您调用了 init 方法并提供了数据库配置)。为了简洁起见,我避免了异常处理:

public class SomeDao {
private Connection con;
//using Dependency Injection by composition for DAO classes with connection
public SomeDao(Connection con) {
this.con = con;
}
public SomeEntity getSomeEntity(int id) {
String sql = "SELECT id, col1, col2 FROM someEntity WHERE id = ?";
//PreparedStatement and ResultSet go on the narrowest possible scope
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setInt(1, id);
ResultSet rs = pstmt.executeQuery();
SomeEntity someEntity = new SomeEntity();
if (rs.hasNext()) {
someEntity.setId(rs.getInt("id");
//similar for other columns...
}
//don't forget to close the resources after its usage
return someEntity;
}
}

public class SomeService {
public SomeEntity getSomeEntity(int id) {
//retrieving the connection at this level
//a service may access to several daos
Connection con = ConnectionProvider.getConnection();
//performing the operations against DAO layer
SomeDao someDao = new SomeDao(con);
SomeEntity someEntity = someDao.getSomeEntity(id);
//closing the connection. This is A MUST
//here the connection pool won't close the physical connection
//instead put it to sleep
con.close();
//return the proper data at a single point of the method
return someEntity;
}
}

关于java - 我的连接对象可以在我的所有表单上使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26407292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com