[英]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
之前不应该关闭连接,否则以后可能无法处理它。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.