我应该在哪里存储DBI连接,何时应该关闭它?

时间:2015-02-25 12:39:41

标签: java jdbi

我将其存储在公共静态字段中

public class DB {

    private static final String url = "jdbc:sqlite:file:target/todo";
    public static final DBI dbi = new DBI(url);


    public static void migrate() {
        Flyway flyway = new Flyway();
        flyway.setDataSource(url, "", "");
        flyway.migrate();
    }
}

从不关闭它,有更好的选择吗?

2 个答案:

答案 0 :(得分:1)

这相当于您如何处理在您的应用程序中获得任何依赖关系。最好的通用模型,恕我直言,将它传递给需要它的东西的构造函数。如果要在数据库访问周围放置某种DAO外观,请将DBI传递给DAO的ctor。如果您使用的是DI框架,请将DBI实例绑定到框架,并@Inject it。

有关Connections的特定问题,JDBC连接的DBI等效项是句柄。您应该获得一个Handle,使用它,并在完成后立即关闭它。 DBI实例的典型用途是为其提供一个管理实际数据库连接的DataSource,通过在完成后立即释放Handle,您可以更好地利用连接池。

在大多数情况下,如果要关闭数据源,则只关闭DBI实例,这就是关闭DBI实例的所有操作。 98%的时间,在java-for-server世界中,关闭数据源是没有意义的,因此担心关闭DBI(与Handle相比)并不是什么大问题。

使用JDBI时,请记住:

DBI -> Datasource
Handle -> Connection
Query/SQLStatement -> Statement

This doc详细阐述了这些。

答案 1 :(得分:0)

最好的选择是创建一个处理程序类。当有人需要时,这个类“处理”处理。你最需要担心的是关闭手柄。如果你真的想要一个快速的系统,像c3p0这样的东西很棒。通常,最好使用getter / setter将可变对象设为private和final。如果需要,可以保持DBI静态。当你打电话来结账处理时,你应该使用try-with-resources。

public Handle getHandle(){
    dbi.open(dataSource);
}

public void doSomething(){
    try(Handle handle = getHandle()){
        // Do something
    }
    catch(DBIException e){
        // TODO Handle it...
    }
}

我可能会让我的处理程序自动关闭,并在关闭时关闭剩下的所有内容(如任何连接池)。顺便说一下,这可以让您在处理程序中提取凭据并保证数据安全。