繁体   English   中英

在 class 属性中保留 JDBC 查询的结果集与简单地返回它

[英]Keeping ResultSet of a JDBC query in a class attribute vs. simply returning it

我目前正在使用连接管理器 class,它将被多次调用。 它的目的是建立连接并将结果作为结果集返回,但我对此有一些疑问。

在 function 中创建结果集变量或更改 object 的结果集字段并返回它是否更快?

这里有两个例子

选项1:

public class ConnectionManager {
    private static String url = "jdbc:mysql://localhost:3306/*********";
    private static String username = "root";
    private static String password = "admin123";

    public ResultSet executeQuery(String query) {
        ResultSet results = null;
        try {
            Connection connect = DriverManager.getConnection(this.url, this.username, this.password);
            Statement statement = connect.createStatement();
            results = statement.executeQuery(query);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return results;
    }

}

选项 2:

public class ConnectionManager {
    private static String url = "jdbc:mysql://localhost:3306/*********";
    private static String username = "root";
    private static String password = "admin123";
    private ResultSet results = null;


    public ResultSet executeQuery(String query) {
        try {
            Connection connect = DriverManager.getConnection(this.url, this.username, this.password);
            Statement statement = connect.createStatement();
            this.results = statement.executeQuery(query);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return this.results;
    }

}

如所写,选项 1 与选项 2 没有太大区别:在选项 2 中, ResultSet属性是private的(可变的 class 属性通常应该是私有的),因此外界无法访问(= 此类之外的代码)。 由于选项 2 与选项 2 相比没有优势(局部变量基本上是免费的,但实例属性应该更明智地选择),您应该 go 与选项 1 但是还有其他问题:

  • 您并没有关闭所有正在打开的连接。 这可能会导致资源耗尽和您的应用程序崩溃。 然而,这并没有一个简单的解决办法,因为在处理完ResultSet之前不应该关闭连接,否则以后可能无法处理它。
  • 在选项 2 中,如果您几乎同时从 2 个线程调用executeQuery ,则两个调用都可能返回第二个ResultSet 所以选项 2 在并发的情况下是危险的。

我会提出以下修复:

  • 存储private Connection connection; 作为 class 属性。 这将为您提供更好的性能,因为建立与数据库的连接成本很高,并且每个查询重新建立一次连接并且从不关闭它们会产生不良后果。 在构造函数中建立连接。
  • 有一个public void close()方法,它只是执行connection.close() 这修复了“不关闭连接”的问题。 仅当您确定不会进行新查询时调用此方法,例如当应用程序关闭时。
  • executeQuery通过查询先前打开的连接返回相应的resultSet ,而不是在每次调用时都重新连接。 当然,我们将采用选项 1:我们为每个新查询返回一个新的ResultSet

这与性能无关,而与设计有关。 两个选项之间的主要区别在于是否具有state 共享字段很可能会带来多线程和混合使用场景的问题,而局部变量更接近“功能性”方法,将ResultSet隔离在调用者的上下文中。

恕我直言,这种情况下的性能只能在实用性和可用性之后考虑。

暂无
暂无

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

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