0

我正在实现一个使用 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 类的多个线程)中运行这段代码,会不会因为我没有在 getSomeData() 中声明 ResultSet rs 而造成混淆?

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

谢谢您的帮助。

4

2 回答 2

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

还:

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

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

于 2012-09-21T13:21:19.420 回答
0

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

于 2012-09-21T13:20:33.197 回答