在多线程环境中使用select for update nowait时,只读结果集的操作无效

爱奴ț

对于Oracle数据库,以下程序仅对某些线程抛出SQL异常。为什么将resultSetConcurrency从降级CONCUR_UPDATABLE to CONCUR_READ_ONLY在单线程环境中不会发生这种情况。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


public class Main extends Thread {

    public static final String DBURL = "jdbc:oracle:thin:@localhost:1521:DB";
    public static final String DBUSER = "USER";
    public static final String DBPASS = "PASS";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        for(int i=0; i<20; i++)
            new Main().start();
    }

    @Override
    public void run() {

        try
        {
            DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());

            Connection con = DriverManager.getConnection(DBURL, DBUSER, DBPASS);
            con.setAutoCommit(false);

            try(PreparedStatement pstmt = con.prepareStatement("SELECT COLUMN1 FROM TABLE1 FOR UPDATE NOWAIT", 
                    ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE))
            {               
                ResultSet rs = pstmt.executeQuery();

                if (rs.next()) {
                    rs.updateString(1, "12345");
                    rs.updateRow();
                }            
            }
            finally
            {
                con.commit();
                con.close();
            }
        }
        catch(SQLException e)
        {
            if(!e.toString().contains("NOWAIT"))
                e.printStackTrace();
        }
    }

}

亚历克斯·普尔

您可以查看针对结果集/语句/连接提出的警告,以了解为什么将其降级。executeQuery()通话后添加以下内容

SQLWarning warning = pstmt.getWarnings();
while (warning != null)
{
    System.out.println("Warning: " + warning.getSQLState()
        + ": " + warning.getErrorCode());
    System.out.println(warning.getMessage());
    warning = warning.getNextWarning();
}

在这种情况下,您有时会看到:

警告:99999:17091
警告:无法以请求的类型和/或并发级别创建结果集:ORA-00054:资源正忙,并且已指定NOWAIT进行获取,或者超时已过期

您正在寻找NOWAIT例外,但正在收到警告。我不清楚的是,为什么在这种情况下仍然可以获得结果集?但是您至少可以捕获该警告,并且如果看到警告,则不会进入结果集循环。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在多线程环境中使用select for update nowait时,只读结果集的操作无效

来自分类Dev

在Oracle中使用FK时查询FOR UPDATE NOWAIT

来自分类Dev

只读结果集的无效操作:updateString

来自分类Dev

使用Bitmap对象时,多线程无效

来自分类Dev

在多线程C#应用程序中使用互操作的Excel文件操作失败

来自分类Dev

在Qt中使用多线程时的事件循环和信号时隙处理

来自分类Dev

在多线程环境中使用ZMQ的正确方法?

来自分类Dev

编写测试以在多线程环境中使用Kafka Consumer

来自分类Dev

如何在多线程环境中使用Servlet

来自分类Dev

在多线程环境中使用ZMQ的正确方法?

来自分类Dev

如何在多线程环境中使用序列

来自分类Dev

在C中使用多线程服务器时无法完成文件传输

来自分类Dev

当需要多线程时,如何在Java中使用列表类?

来自分类Dev

如何在C#中使用多线程时循环列表

来自分类Dev

Oracle 12c:在不相交的行集上并行 SELECT FOR UPDATE NOWAIT 导致 ORA-00054:资源繁忙

来自分类Dev

使用多线程时如何摆脱滞后

来自分类Dev

在启动时使用多线程?

来自分类Dev

在处理链表时如何使用多线程

来自分类Dev

使用Python多线程时的属性错误

来自分类Dev

使用多线程时 GUI 仍然冻结

来自分类Dev

使用多线程时内核死机

来自分类Dev

使用Invoke时跨线程操作无效

来自分类Dev

在MySQL中使用SELECT ... FOR UPDATE进行死锁

来自分类Dev

如何在mysql中使用update和select...for update

来自分类Dev

在更多线程中使用Python gRPC客户端存根时,可以提高性能吗?

来自分类Dev

如何在函数中使用查询结果执行UPDATE

来自分类Dev

在多线程UI WPF应用程序中使用实时可视树时,出现“调用线程无法访问该对象”异常

来自分类Dev

python中使用并行线程的多线程

来自分类Dev

SELECT + UPDATE避免返回相同的结果

Related 相关文章

  1. 1

    在多线程环境中使用select for update nowait时,只读结果集的操作无效

  2. 2

    在Oracle中使用FK时查询FOR UPDATE NOWAIT

  3. 3

    只读结果集的无效操作:updateString

  4. 4

    使用Bitmap对象时,多线程无效

  5. 5

    在多线程C#应用程序中使用互操作的Excel文件操作失败

  6. 6

    在Qt中使用多线程时的事件循环和信号时隙处理

  7. 7

    在多线程环境中使用ZMQ的正确方法?

  8. 8

    编写测试以在多线程环境中使用Kafka Consumer

  9. 9

    如何在多线程环境中使用Servlet

  10. 10

    在多线程环境中使用ZMQ的正确方法?

  11. 11

    如何在多线程环境中使用序列

  12. 12

    在C中使用多线程服务器时无法完成文件传输

  13. 13

    当需要多线程时,如何在Java中使用列表类?

  14. 14

    如何在C#中使用多线程时循环列表

  15. 15

    Oracle 12c:在不相交的行集上并行 SELECT FOR UPDATE NOWAIT 导致 ORA-00054:资源繁忙

  16. 16

    使用多线程时如何摆脱滞后

  17. 17

    在启动时使用多线程?

  18. 18

    在处理链表时如何使用多线程

  19. 19

    使用Python多线程时的属性错误

  20. 20

    使用多线程时 GUI 仍然冻结

  21. 21

    使用多线程时内核死机

  22. 22

    使用Invoke时跨线程操作无效

  23. 23

    在MySQL中使用SELECT ... FOR UPDATE进行死锁

  24. 24

    如何在mysql中使用update和select...for update

  25. 25

    在更多线程中使用Python gRPC客户端存根时,可以提高性能吗?

  26. 26

    如何在函数中使用查询结果执行UPDATE

  27. 27

    在多线程UI WPF应用程序中使用实时可视树时,出现“调用线程无法访问该对象”异常

  28. 28

    python中使用并行线程的多线程

  29. 29

    SELECT + UPDATE避免返回相同的结果

热门标签

归档