当前位置: 首页 > 知识库问答 >
问题:

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

薄鸿远
2023-03-14
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
        }
    }
}

我有几个问题。

>

  • 如果我连续调用getSomeData(),是否每次都为stmt和rs分配新对象?

    不管上面问题的答案如何,如果我在多线程环境中运行这段代码(使用MysqlUtils类的多线程),会不会因为我没有在getSomeData()中声明ResultSet rs而出现混淆?

  • 共有1个答案

    厍建义
    2023-03-14
    1. 是的。将执行该方法,因此stmtrs将取新值。当然,您可能有您的类的多个实例,因此也有这两个字段的多个实例。
    2. 是的。这段代码完全是线程安全的。一般情况下,公共字段几乎总是应该避免的。特别是在多线程环境中
    3. 是的,这是一个糟糕的选择。变量的作用域应尽可能小。并且这些变量在一个单一的方法中使用,并且每次重新分配。它们应该是局部变量。

    还有:

    • 方法getSomeData()应该返回一些东西,而不仅仅是打印一些东西
    • 应该在finally块中关闭ResultSet和语句
    • 我希望错误管理不是包含异常
     类似资料:
    • 我目前正在学习多线程,我发现了一些我无法解释的有趣的东西。据我所知,如果两个线程访问一个静态变量,它们可以将自己的副本复制到缓存中。Thread1对其本地缓存中的静态变量进行的更新不会反映在Thread2缓存的静态变量中。 java java

    • 问题内容: 我正在尝试在多线程环境中对int变量进行经典的递增/递减。这是我的示例代码。 尽管我对所有三个线程都使用了join()方法,但结果仍然不一致。在这里加入不是意味着主线程要等到每个线程都完成执行吗?我什至尝试将同步添加到三个方法签名中的每个;但是我得到不一致的结果。 除了使用该变量的Atomic版本外,我还能如何确保始终获得0? 问题答案: 您的SyncCounter根本不是线程安全的。

    • 问题内容: 是否可以重用在多个容器之间共享的环境变量以避免重复,如本示例所示: 问题答案: 该选项可能是好的,但它不支持在撰写文件。其他走的方式是: 扩展名字段(撰写文件3.4+) 如果可以使用3.4+组成文件,则扩展名字段可能是最佳选择: docker-compose.yml env_file指令 docker-compose.yml variables.env * 项目根目录中的 *.env

    • 我正在Java学习重写成员函数,并考虑过尝试重写成员变量。 所以,我给类下了定义 输出为: 我不明白为什么当aRef设置为b时,intVal仍然是A类?

    • 值文件得代码段. 在deployment.yaml中,当引用值时,仅设置姓氏/值,其他值将被覆盖。如何读取/设置部署文件中的所有名称/值?

    • 问题内容: 根据文档, “客户端是管理客户端通信基础结构的重量级对象。初始化和处理客户端实例可能是一项相当昂贵的操作。因此,建议在应用程序中仅构造少量的客户端实例。” 好的,我试图将客户端本身和WebTarget实例缓存在一个静态变量中,在多线程环境中调用someMethod(): 但是有时(并非总是)我会例外: 无效使用BasicClientConnManager:连接仍被分配。在分配另一个之前