在多线程环境中重用ResultSet成员变量

时间:2012-09-21 13:03:25

标签: java mysql jdbc resultset

我正在实现一个使用JDBC驱动程序的代码。

以下是我制作的代码。

public class MysqlUtils {
    public Connection conn;
    public ResultSet rs;
    public PreparedStatement stmt;

    public MysqlUtils(String address, String id, String passwd) {
        try {
            conn = DriverManager.getConnection(address, id, passwd);
            stmt = null;
            rs = null;
        } catch (SQLException e) {
            // error management
        }
    }

    public void getSomeData(long id) {
        try {
            stmt = conn.prepareStatement("SELECT * FROM some_table");
            rs = stmt.executeQuery();
            rs.next();
            System.out.println(rs.getString("some_column");
        } catch (SQLException e) {
            // error management
        }
    }
}

我已将Connection conn,ResultSet rs,PreparedStatement stmt声明为成员变量,因为我认为这可能会帮助我提高性能。

我有几个问题。

  1. 如果我连续调用getSomeData(),每次都会为stmt和rs分配新对象吗?

  2. 无论上述问题的答案如何,如果我在多线程环境中运行此代码(使用MysqlUtils类的多个线程),是否会混淆,因为我没有声明ResultSet rs in getSomeData()?

  3. 将Connection conn,ResultSet rs,PreparedStatement stmt声明为成员变量是一个糟糕的选择吗?换句话说,我的JDBC实现是否可行?

  4. 感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

  1. 是。该方法将被执行,因此stmtrs将采用新值。当然,您可能有多个类的实例,因此可能有这两个字段的多个实例。
  2. 是。此代码是完整的线程 - * un * safe。通常应该避免公共领域。特别是在多线程环境中
  3. 是的,这是一个糟糕的选择。变量的范围应尽可能小。这些变量在单个方法中使用,并且每次都重新分配。它们应该是局部变量。
  4. 另外:

    • 方法getSomeData()应该返回一些东西,而不仅仅是打印一些东西
    • 应该在finally块
    • 中关闭ResultSet和Statement
    • 我希望错误管理不包括吞下异常

    我建议使用spring-jdbc,它会为您处理所有管道代码,并避免您的代码目前遇到的所有问题。

答案 1 :(得分:0)

不要在方法之外使用ResultSet ....使用while(rs.next)(rs = resultSet)循环数据库表并检索值!