我有下面的代码,它使用 BasicDataSource、Sql Connection、Statement 和 ResultSet 的静态对象。下面的代码工作正常,但我只想知道使用此类编码实践的安全性。或者我如何优化下面的代码,使其变得更加稳定和可靠。
public class Testing {
static BasicDataSource bds = DBConnection.getInstance().getBds();
static Connection con = null;
static PreparedStatement stmt = null;
static ResultSet rs = null;
private void show() {
try {
con = bds.getConnection();
stmt = con.prepareStatement("SELECT * FROM users");
rs = stmt.executeQuery();
if(rs.next()) {
System.out.println(rs.getString("firstname") + " " + rs.getString("lastname"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private void display() {
try {
con = bds.getConnection();
stmt = con.prepareStatement("SELECT * FROM agent_cities");
rs = stmt.executeQuery();
while(rs.next()) {
System.out.println(rs.getString("city_name"));
}
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
private void add() {
try {
con = bds.getConnection();
stmt = con.prepareStatement("UPDATE users SET firstname = 'shsh' WHERE id = 2");
stmt.executeUpdate();
System.out.println("updated successfully");
} catch (SQLException e) {
e.printStackTrace();
}finally {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Testing t = new Testing();
t.show();
t.display();
t.add();
}
}
提前致谢。 请分享您可以破解上述代码的案例并质疑其安全性。
更新: 更新只是为了确保没有人应该使用我在上面的程序中使用的静态字段,因为上面的程序在部署到开发服务器上时包含错误。
在大型系统上使用上述代码后,我发现了该错误。一个月前,我对上面的代码没有任何问题,并且工作正常,但今天我发现了这个错误。
错误:
在点击我的 API 6-7 次后,它在第 8 次点击时停止响应。我真的不知道为什么,也不知道程序中存在的漏洞。 但现在,当我接受答案时,我更改了源代码并开始在代码中使用 try-with 资源并删除了静态字段。
但是我仍然很想知道我在上面的代码中发现的错误。 在 7-8 次 API 命中后,它不会给出响应并挂起。 请分享您对此的想法。我正在使用 apache tomcat 8.5.32 服务器。 提前致谢。
最佳答案
更好地使用尝试资源。即使引发异常或内部返回,这也会自动关闭 Connection、Statement 和 ResultSet。
String sql = "UPDATE users SET firstname = ? WHERE id = ?";
try (Connection con = bds.getConnection();
PreparedStatement stmt = con.prepareStatement()) {
stmt.setString(1, "shsh");
stmt.setLong(2, 2);
stmt.executeUpdate();
System.out.println("updated successfully");
}
String sql = "SELECT city_name FROM agent_cities";
try (Connection con = bds.getConnection();
PreparedStatement stmt = con.prepareStatement()) {
try (ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
System.out.println(rs.getString("city_name"));
}
}
}
这更有利于垃圾收集。防止不良的 rs2、rs3。允许多用户并发,就像在服务器应用程序中一样。查询自身的调用。
而static
更是具有全局变量的风格。
关于java - 可以在多个类方法中使用相同的 BasicDataSource、Connection、Statement 和 ResultSet 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55023282/