java – 跨类访问H2连接
我正在尝试避免静态和单身,同时将本地
H2数据库集成到我的JavaFX应用程序(Java8)中.其他五个类(包括控制器)需要访问数据库,所以我试图共享它们之间的一个H2连接.我已经阅读了
Connection Pool,避免了不必要的重新连接,但如果它适用于此,我会感到困惑.桌面使用,单用户.
以下ExtrasDB类包含3个方法,initializeDB,getDBValues和performQuery.以前这些方法是静态的,我会使用ExtrasDB.getDBValues()从其他类调用它们并相应地使用结果,但由于我的应用程序使用多个线程,我正在寻找更好的方法.我正在从我的应用程序中删除所有静态/单例使用. initializeDB方法创建连接并在必要时创建表,并且此方法仅从我的主控制器的initialize方法调用一次.这会导致连接conn与该实例隔离,并且对getDBValues或performQuery的其他类调用无法访问,从而导致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(); } } } 解决方法
如果您不想要某种静态访问,则有两个选项:
>在程序启动时创建Service-Factory实例(非静态). Service-Factory是一个pojo类,包含要在其他类中共享的所有依赖项.这些依赖项可以由Service-Factory创建,也可以使用setter设置.所有需要一些依赖关系的类只需要提供Factory实例. 在我的JavaFX-App中使用第一个选项.我有一个名为Root的类,并在javafx.application.Application :: start函数中创建它的实例.一些依赖项由Root类创建,其他一些依赖项(例如控制器实例)使用setter设置.因为我是通过fxml-loader加载我的控制器,所以我不能使用构造函数来提供Root实例,而是每个控制器都有一个init函数 public void initialize(Root root); 如果您需要更多帮助.随意评论这个答案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |