繁体   English   中英

跨类访问H2连接

[英]Access H2 connection across classes

我正在尝试避免静态和单身,同时将本地H2数据库集成到我的JavaFX应用程序(Java8)中。 其他五个类(包括控制器)需要访问数据库,所以我试图共享它们之间的一个H2连接。 我已经阅读了连接池,避免了不必要的重新连接,但如果它适用于此,我会感到困惑。 桌面使用,单用户。

以下ExtrasDB类包含3个方法, initializeDBgetDBValuesperformQuery 以前这些方法是static ,我会使用ExtrasDB.getDBValues()从其他类调用它们并相应地使用结果,但由于我的应用程序使用多个线程,我正在寻找更好的方法。 我正在从我的应用程序中删除所有静态/单例使用。

initializeDB方法创建连接并在必要时创建表,并且此方法仅从我的主控制器的initialize方法调用一次。 这会导致连接conn与该实例隔离,并且对getDBValuesperformQuery其他类调用无法访问,从而导致null结果集。 如何使数据库连接可访问所有必需的类,以便这些类可以使用上述方法自由访问数据库?

public class ExtrasDB {

    final String JDBC_DRIVER = "org.h2.Driver";
    final String DB_URL = "jdbc:h2:~/mainDB";
    final String USER = "test";
    final String PASS = "test";
    Connection conn = null;
    Statement statement = null;
    String myStatement;
    ResultSet rs;
    DatabaseMetaData meta;

    public void initializeDB() {

        try {
            Class.forName("org.h2.Driver");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("Connected to database successfully...");
            statement = conn.createStatement();
            meta = conn.getMetaData();
            rs = meta.getTables(null, null, "EXTRAS", new String[]{"TABLE"});  // <--- Checks for existence of table "EXTRAS"

            if (!rs.next()) {

                System.out.println("Table doesn't exist yet... Creating...");
                sql = "CREATE TABLE EXTRAS " +
                        "(column_1 VARCHAR(255), " +
                        " column_2 VARCHAR(255))";

                statement.executeUpdate(sql);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }


    public void getDBValues() throws SQLException {
        rs = statement.executeQuery("SELECT * FROM EXTRAS");
        while (rs.next()) {
            //..... do something
        }
    }

    public void performQuery(String query) {
        try {
            statement.executeUpdate(query);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

如果您不想要某种静态访问,则有两个选项:

  1. 在程序启动时创建Service-Factory实例(非静态)。 Service-Factory是一个pojo类,包含要在其他类中共享的所有依赖项。 这些依赖项可以由Service-Factory创建,也可以使用setter设置。 所有需要一些依赖关系的类只需要提供Factory实例。
  2. 您可以使用一些实现自动依赖注入的框架。 使用这样的框架,您只需要注释构造函数或字段。 有关依赖注入和本教程的更多信息,请参阅此链接 ,了解如何使用spring框架进行依赖项注入。

在我的JavaFX-App中使用第一个选项。 我有一个名为Root的类,并在javafx.application.Application :: start函数中创建它的实例。 一些依赖项由Root类创建,其他一些依赖项(例如控制器实例)使用setter设置。 因为我是通过fxml-loader加载我的控制器,所以我不能使用构造函数来提供Root实例,而是每个控制器都有一个init函数

public void initialize(Root root);

如果您需要更多帮助。 随意评论这个答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM