java 连接 h2,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"}); //

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实例.

>您可以使用一些实现自动依赖注入的框架.使用这样的框架,您只需要注释构造函数或字段.有关依赖项注入的详细信息,请参阅this link;有关如何使用spring框架进行依赖项注入,请参阅this tutorial.

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

public void initialize(Root root);

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

标签:java,jdbc,connection-pooling,javafx,h2

来源: https://codeday.me/bug/20190711/1429739.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值