java - 可以在多个类方法中使用相同的 BasicDataSource、Connection、Statement 和 ResultSet 对象吗?

标签 java maven debugging garbage-collection apache-commons-dbcp

我有下面的代码,它使用 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/

相关文章:

java - 用于解决与云 API 的依赖关系的 Maven

c# - 为什么附加 VS 调试器后应用程序的行为会有所不同?

android - 是什么导致了输出 "Check failed: threadId != 0u"的崩溃?

java - 如何使用 JAXB 和 Spring 解码具有重复条目的 xml

java - 在 pom.xml 中指定换行符

java - 此应用程序不存在 (app_id=u'google.com :nbsocialmetrics')

ios - 通过 VPN 连接的 iPhone 远程调试

Java:如何从集合中获取n个元素

java - 在 Controller 上使用@RolesAllowed 并获取 "object is not an instance of declaring class"

java - 使用 double 的二元运算符 '>' 的操作数类型错误