在 javafx 应用中,应避免长期持有单个 `connection` 实例,而应在每次数据库操作时按需创建、使用并自动关闭连接(推荐 try-with-resources);所有耗时的数据库操作必须在后台线程(如 `task
JavaFX 是单线程 GUI 框架,主线程(JavaFX Application Thread)专用于渲染界面和处理用户事件。若将数据库操作(如查询、增删改)直接放在主线程中执行,会导致界面卡顿甚至无响应。因此,连接管理 + 异步执行是 JavaFX 数据库开发的两大核心原则。
不推荐全局共享单一 Connection 实例,原因如下:
✅ 推荐做法:封装连接获取逻辑,并结合 try-with-resources 确保资源自动释放:
public class Database {
private static final String URL = "jdbc:mysql://localhost:3306/myapp";
private static final String USER = "root";
private static final String PASS = "password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASS);
}
}在业务方法中,始终在 try-with-resources 中使用连接:
public void loadUsers() { Task
> task = new Task<>() { @Override protected List
call() throws Exception { List users = new ArrayList<>(); String sql = "SELECT id, name, email FROM users"; // 自动管理 Connection、Statement、ResultSet 生命周期 try (Connection conn = Database.getConnection(); PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { while (rs.next()) { users.add(new User( rs.getLong("id"), rs.getString("name"), rs.getString("email") )); } } return users; } }; // 绑定结果到 UI(必须在 JavaFX 线程中) task.setOnSucceeded(e -> { ObservableList data = FXCollections.observableArrayList(task.getValue()); tableView.setItems(data); }); task.setOnFailed(e -> { Throwable error = task.getException(); Alert alert = new Alert(Alert.AlertType.ERROR, "加载用户失败: " + error.getMessage()); alert.showAndWait(); }); new Thread(task).start(); }
HikariConfig config = new HikariConfig();
config.setJdbcUrl(URL); config.setUsername(USER); config.setPassword(PASS);
config.setMaximumPoolSize(10); config.setConnectionTimeout(3000);
public static final HikariDataSource dataSource = new HikariDataSource(config);
// 使用时:try (Connection conn = dataSource.getConnection()) { ... }综上,JavaFX 数据库开发的黄金法则是:短生命周期连接 + 后台线程执行 + 资源自动管理。这既符合 JDBC 规范,也契合 JavaFX 的线程模型,是构建健壮、响应迅速桌面应用的基础保障。