Java调用存储过程长时间未执行完问题-解决方案

解决java连接Hbase程序卡住执行也不报错的问题 问题描述: 最近在hadoop集群上搭建好Hbase,用hbase shell进行增删改查操作都没有问题,但是用java API来对hbase进行操作却出现一个很奇怪的问题,就是执行java程序后没有任何反应,程序也不报错。 首先贴出我的测试代码: import java.io.IOException; import org.apache.hadoop.conf.Configuration 阅读详情

上午在生产服务器发现一个不小的问题,就是一个程序在调用存储过程中抢到了锁,但抢到锁后调用存储过程执行出现卡死的情况,导致抢到的锁迟迟没有释放,这导致第二天程序执行时,因为无法获取到锁而无法正常执行。

**解决方案:**引入Future类,并设定调用存储过程执行的超时时间,通过get(long timeout, TimeUnit unit),当抛出超时异常时,记录异常,往下进行其他处理逻辑,并正常释放锁。

当创建了Future实例,任务可能有以下三种状态:

  • 等待状态。此时调用cancel()方法不管传入true还是false都会标记为取消,任务依然保存在任务队列中,但当轮到此任务运行时会直接跳过。
  • 完成状态。此时cancel()不会起任何作用,因为任务已经完成了。
  • 运行中。此时传入true会中断正在执行的任务,传入false则不会中断。

总结:
Future.cancel(true)适用于:
(1) 长时间处于运行的任务,并且能够处理interruption

Future.cancel(false)适用于:
(1) 未能处理interruption的任务 ;
(2) 不清楚任务是否支持取消 ;
(3) 需要等待已经开始的任务执行完成

** 吊诡的事情:** 当超时后,我调用Future的cancel(true)方法,在本地demo测试如下代码时,均可以正常中断任务线程,但在Spring项目工程中使用时,却没有实现效果。这个坑,暂且留下,还待后面再补上。

回复吊诡的事情:这里把坑补上,其实吊诡的事情并不吊诡,主要是我事先没有一个词“能够处理interruption”或是“可中断的方法”。下面解释一下:

当一个方法内部调用了wait、sleep、join等方法时,会使得当前线程进入阻塞状态,若另外的一个线程调用被阻塞线程的interrupt方法,则会打断这种阻塞,因此这种方法有时会被称为可中断方法。记住,打断一个线程并不等于该线程的生命周期结束,仅仅是打断了当前线程的阻塞状态。

而所谓“吊诡的事情”发生,正是因为我在demo测试的代码中调用sleep方法,使得demo测试的代码成为了可中断的方法,而Spring工程中的代码,未调用sleep等类方法,也就是未进入阻塞状态,故而无法被中断。

demo测试代码:


package com.xgh.demo.threaddemo;


import java.util.concurrent.*;

public class TestFuture {

    public static void main(String[] args) {

        try {
            testTimeout3(100);
            System.out.println("执行结束3。。。。");
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }

    public static void testTimeout1(final int num) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newScheduledThreadPool(5);
        Future result1 = executor.submit(new Callable() {
            @Override
            public Integer call() throws Exception {
                Thread.sleep(10000);
                System.out.println(num + "-22222222222222" + Thread.currentThread().getName());
                return num;
            }

        });
        System.out.println("下面开始判断程序是否超时或已经执行完毕。。。");
        long currentTimeMillis = System.currentTimeMillis();

        long timeout = 5 * 1000L;
        while (!result1.isDone()) {
            long timecha = System.currentTimeMillis() - currentTimeMillis;
            if (timecha >= timeout) {
                System.out.println("revoke timeout");
                boolean cancel = result1.cancel(true);
                System.out.println("revoke cancel result : --->" + cancel + " ;result isCancelled: " + result1.isCancelled());
                cancel = result1.cancel(true);
                System.out.println("revoke cancel result2 : --->" + cancel + " ;result isCancelled: " + result1.isCancelled());
                break;
            }

            if (result1.isDone()) {
                System.out.println("result1----->" + result1.get());
                System.out.println("revoke success...");
                boolean cancel = result1.cancel(true);
                System.out.println("revoke cancel result : --->" + cancel);
                break;
            }
        }
        executor.shutdown(); //关闭线程池
    }

    public static void testTimeout2(final int num) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newScheduledThreadPool(5);
        Future result1 = executor.submit(new Callable() {
            @Override
            public Boolean call() throws Exception {
                Thread.sleep(10000);
                System.out.println(num + "=========" + Thread.currentThread().getName());
                return true;
            }

        });
        long timeout = 5 * 1000L;
        try {
            boolean result = (boolean) result1.get(timeout, TimeUnit.MILLISECONDS);
            System.out.println("revoke success,result ----->" + result);
        } catch (TimeoutException e) {
            System.out.println("revoke timeout:" + e);
            boolean cancel = result1.cancel(true);
            System.out.println("revoke cancel result : --->" + cancel + " ;result isCancelled: " + result1.isCancelled());
        }
        executor.shutdown();
    }

    /**
     * 验证不可中断的方法
     * @param num
     * @throws InterruptedException
     * @throws ExecutionException
     */
    public static void testTimeout3(final int num) throws InterruptedException, ExecutionException {
        ExecutorService executor = Executors.newScheduledThreadPool(5);
        Future result1 = executor.submit(new Callable() {
            @Override
            public Integer call() throws Exception {
                int i= 1;
                while (true){
                    System.out.println(num + "-22222222222222" + Thread.currentThread().getName()+"=="+Thread.currentThread().isInterrupted());
                    i ++;
                    if (i == 99999999){
                        break;
                    }
                }
                return num;
            }

        });
        System.out.println("下面开始判断程序是否超时或已经执行完毕。。。");
        long currentTimeMillis = System.currentTimeMillis();

        long timeout = 2000L;
        while (!result1.isDone()) {
            long timecha = System.currentTimeMillis() - currentTimeMillis;
            if (timecha >= timeout) {
                System.out.println("revoke timeout");
                boolean cancel = result1.cancel(true);
                System.out.println("revoke cancel result : --->" + cancel + " ;result isCancelled: " + result1.isCancelled());
                cancel = result1.cancel(true);
                System.out.println("revoke cancel result2 : --->" + cancel + " ;result isCancelled: " + result1.isCancelled());
                break;
            }

            if (result1.isDone()) {
                System.out.println("result1----->" + result1.get());
                System.out.println("revoke success...");
                boolean cancel = result1.cancel(true);
                System.out.println("revoke cancel result : --->" + cancel);
                break;
            }
        }
        executor.shutdown(); //关闭线程池
    }
}



参考文章:
https://felord.blog.youkuaiyun.com/article/details/104788189
https://blog.youkuaiyun.com/u014252478/article/details/82109694
https://blog.youkuaiyun.com/qq_24630433/article/details/88537407

如何处理Java开发中的数据库连接超时问题 在Java开发中,数据库连接超时是一个常见的问题。当应用程序试图连接到数据库时,如果连接花费的时间超过了预设的超时时间,就会出现连接超时错误。在Java开发中,解决数据库连接超时问题可以通过调整连接超时时间、使用连接池管理连接以及检查网络和数据库服务器来实现。通过合理的配置和优化,我们可以减少连接超时错误的发生,并提高应用程序的性能和可靠性。参数,并将其设置为5000毫秒,可以将连接超时时间设置为5秒。希望以上信息对您有所帮助!在上面的示例中,通过在连接字符串中添加。方法设置连接超时时间为5秒。 阅读详情

相关推荐

Ubuntu的初步环境配置(VMware)

4.屏幕显示不全解决完后,在试用Ubuntu里面,直接双击“安装Ubuntu 20.04.6 LTS”。如果不存在“屏幕显示不全”的问题,直接点击安装即可,大致安装步骤与以下步骤类似。15.点击现在重启,重启成功后,会出现“清除安装介质”的问题。19.此时点开火狐,可以上网,但只可输入英文,不可以输入中文,具体解决方法见3.2。3.进入安装界面,此时可能会出现“屏幕显示不全”的问题,具体解决方法见3.1。8.选择“正常安装”、“安装Ubuntu时下载更新”,点击继续。最后,点击保留更改,设置成功。

森菌蛙诺的博客 2276

java 调用存储过程无反应_Java调用存储过程长时间未执行完问题-解决方案

上午在生产服务器发现一个不小的问题,就是一个程序在调用存储过程中抢到了锁,但抢到锁后调用存储过程执行出现卡死的情况,导致抢到的锁迟迟没有释放,这导致第二天程序执行时,因为无法获取到锁而无法正常执行。解决方案:引入Future类,并设定调用存储过程执行的超时时间,通过get(long timeout, TimeUnit unit),当抛出超时异常时,记录异常,往下进行其他处理逻辑,并正常释放锁。当创...

weixin_39527768的博客 1382

DC综合中set_dft_signal的实战配置与优化策略

本文深入解析了DC综合中set_dft_signal命令的实战配置与优化策略。文章从命令的核心作用出发,详细拆解了-view、-type、-usage等关键参数,并通过扫描使能与时钟门控的实战案例,展示了如何正确配置以实现测试模式下的功耗优化。同时,文章总结了高级优化策略、与低功耗流程的协同方法以及常见错误排查清单,旨在帮助数字芯片设计工程师构建高可测性、低功耗的稳健DFT基础。

weixin_28347369的博客 403

java调用oracle存储过程,报错SQLException :Cursor is closed

java调用oracle存储过程,报错SQLException :Cursor is closed 背景描述 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高

sinat_35458330的博客 3896

Word公式一键转MathType保姆级教程(附omml2mml.xsl报错终极解决方案)

本文提供Word公式一键转MathType的保姆级教程,重点解决常见的omml2mml.xsl报错问题。通过详细分析报错原因、官方解决方案实操步骤及转换后格式优化技巧,帮助用户高效完成公式转换,适用于科研论文和商业文档编辑。

weixin_30082367的博客 555

【AI Agent】Harness Engineering实践

Harness(运行宿主)是围绕 LLM构建的一套确定性工程系统,其核心职责是:承认模型的固有局限,用可控的工程手段逐一弥补,使"强大但不可靠的推理引擎"变成"可信赖的生产级Agent"模型 是发动机——提供原始动力Agent 是驾驶员——做出决策Harness 是道路、地图、护栏、仪表盘、维修站和质检线——确保行驶安全有序没有Harness,模型越强,可能只是更快地制造混乱。

sysu_lluozh 192

Java JDBC调用SqlServer存储过程 结果集为空

存储过程用到了临时表,rs总是没有返回值。虽然直接也没有找到原因,但是找到了解决的办法。存储过程开始和结尾分别加上set nocount on和set nocount off。加上了 ,完美的查到了结果。

康师傅没有眼泪 1080

BAQ压缩原理

BAQ——Block Adaptive Quantization,块自适应量化,一种数据压缩算法。

2872

java事件监听器无效_Java的事件监听器学习心得

在Java的swing编程中,Java中的事件机制非常常用一. 事件监听器的参与者:1.事件对象:一般继承自java.util.EventObject对象,由开发者自行定义.2.事件源:就是触发事件的源头,不同的事件源会触发不同的事件类型.3.事件监听器:事件监听器负责监听事件源发出的事件.一个事件监听器通常实现java.util.EventListener这个标识接口.其整个处理过程是这样的,事...

weixin_35476604的博客 1258

ardupilot SBUS输入捕获

本节主要记录ardupilot 的sbus 输入捕获功能。ardupilot 默认支持多种无线协议控制输入设备,比如常用的PPM,SBUS,IBUS,DSM,SUMD,SRXL等协议,本节主要讲解ardupilot 如何通过定时器的pwm输入捕获来获取sbus数据。

陌城烟雨 271

2026年佰维存储数字IC笔试试卷带答案

建立时间是有效时钟沿到来前,输入数据必须稳定保持的最短时间。保持时间是有效时钟沿到来后,输入数据必须继续稳定保持的最短时间。

Open 103

Java调用python脚本,进程长时间卡住问题

Java项目调用python脚本,执行时python脚本一直卡在某一步骤,不继续执行,经查找发现是python代码中加了 print 打印语句导致缓冲区满,我的方法是直接去除 print 打印就好了,或者参考下面方式 5. 启动shell进程后,发现进程长时间运行无法结束,同时失去响应。这个问题的原因是shell脚本或者命令在运行的过程中会向标准输出或者标准错误输出写出数据,但JVM又没有去读,导致缓冲区满,进而导致进程阻塞。这个问题的解决的方法比较简单,既然问题是缓冲区满之后没有及时清理,那么只要在Ja

CatchCat的博客 3834

SiC MOSFET 失效机制详解

TDDB 指在相对较低电场(通常接近或略高于器件工作电压)下,长时间施加电压导致介电层(如栅氧化物)逐渐退化并最终击穿的现象。与即时击穿(Immediate Breakdown,由强电场直接引起)不同,TDDB 是时间相关的渐进过程,通常发生在数小时、几天甚至数年之后。核心过程:在 MOSFET 中,栅极与衬底之间施加电压时,电子通过量子隧道效应(Tunneling)注入介电层,形成缺陷或陷阱。这些缺陷积累,最终在介电层中形成导电路径(Conductive Path),导致短路和器件失效。统计特性。

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 382

java调oracle异步执行_Oracle存储过程中异步调用的实际操作步骤

我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用。而有些相关的业务逻辑处理量大并且复杂。使客户端调用存储过程后,长时间没有反应,也不知Oracle存储过程运行状态,本文讲述如何在ORACLE通过任务和管道的应用,异步调用存储过程的方法。基本原理1.使用DBMS_JOB包将主处理存储过程作为任务提交到任务队...

weixin_28726391的博客 439

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

java调用python程序问题汇总:java调用python程序执行到一半停止;java无法调用python程序;java Runtime调用python无法执行完全

java调用python程序问题汇总:java调用python程序执行到一半停止;java无法调用python程序;java Runtime调用python无法执行完全

浩栋的博客 4842

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

java 调用失败后重新调用,手动执行 Example 代码长时间未操作后再次调用服务出现 500 错误...

代码为 Example 中的代码,按照文档步骤操作后访问正常,过了六小时未操作后再次调用接口服务器会报 500 异常,手动将 Broker、Respones、Request 重启后正常访问2019-12-11 10:27:20.625 INFO 97481 --- [ main] o.s.b.web.embedded.netty.NettyWebServer : Netty...

weixin_30134531的博客 716

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java调用shell出现2_Java执行Shell遇到的各种问题

3、shell脚本中有关联脚本,注意路径就是shell脚本中还要执行其他脚本,这时候就是注意一个路径的问题,这个问题也是我找了好长时间的一个问题。Process p=Runtime.getRuntime().exec(“/etc/a.sh”)在Test.Java类调用了etc目录下的a.sh脚本, a.sh脚本中执行etc目录下的b.sh脚本,原来我在a.sh脚本中写的是./b.sh。其实这样li...

weixin_36448083的博客 412

java 批量执行存储过程_JAVA执行存储过程(通用方法)

我们手工执行java程序是这样的: 1 在记事本中或者是UE的文本编辑器中,写好源程序; 2 使用javac命令把源程序编译成.class文件; 编译后的.class(类字节码)文件中会包含以下内容: ConstantPool:符号表; FieldInfo:类中的成员变量信息; MethodInf/*** 执行存储过程* @param 存储过程名称* @param 所需参数* @retu...

weixin_39932762的博客 395

java远程调用服务器执行命令

java远程调用服务器执行命令 maven所需包 <dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency> S...

csdn1115698735的博客 2534

Java Servlet调用多结果集存储过程的实现与优化

存储过程是数据库编程中的重要技术,通过预编译SQL语句集合提高执行效率。Java Servlet作为Web开发的核心组件,与存储过程结合能构建高效的企业级应用。在多结果集处理场景中,JDBC的getMoreResults()方法配合ResultSet对象实现有序遍历,需特别注意资源释放和异常处理。典型应用包括电商系统的订单查询、报表统计等复杂业务场景。通过连接池优化、异步处理等技术手段,可显著提升系统吞吐量。本文以MySQL存储过程为例,详细解析Servlet中处理多结果集的最佳实践,涵盖事务管理、性能优化

weixin_34289454的博客 777

在JAVA中如何实现长时间任务

google_ad_client = "pub-8800625213955058";/* 336x280, 创建于 07-11-21 */google_ad_slot = "0989131976";google_ad_width = 336;google_ad_height = 280;//<script type="text/java

java专栏 751

使用JDBC CallableStatements执行存储过程

使用JDBCCallableStatements执行存储过程 实验目的:掌握jdbc callableStatements 的执行过程。 实验内容:掌握jdbc callableStatements 的执行过程。 实验过程: CallableStatement的所有超级接口为PreparedStatement、Statement、Wrapper。其中继承自PreparedStatemen...

weixin_30709061的博客 91

Mybatis 调用 带返回值 的存储过程

Mybatis Plus 调用Oracle存储 返回索引 Cursor什么要写这篇博客存储过程Mapper.xmlEntityMapper.javaBiz 什么要写这篇博客 mybatis 调用oracle 存储过程,返回一个表。这样的景场用得比较少,我用了mybatis这么长时间,还第一次这么用。 尝试过程也是比较痛苦,网上资料少不说,很多配置拿下来,也是跑不起来。。最后自己不停地跟据myba...

Richy的博客 1755

java调python脚本的调到了 但是没执行就返回了n_java调用python,python代码自动停止了,找不到原因...

String[] args = {"python3", pythonFile};Process process = Runtime.getRuntime().exec(args);int exitValue = process.waitFor();BufferedInputStream in = new BufferedInputStream(process.getInputStream());B...

weixin_39789857的博客 194

oracle触发器+存储过程发送http请求2

在上篇文章解决oracle触发器+存储过程发送http请求 问题之后,发现了一个问题: 如果web接口崩溃致使web请求失败,由于web请求的timeout最终导致触发器执行周期非常长,因此无法应用于实际项目。遂想到oracle是可以运行简单java代码的,用java代码异步执行web请求是否可以解决该问题呢? 因此本文介绍了oracle 加载java 类实现访问http请求。 1、加载 java source 在 sql 编辑器中运行 以下代码创建java source create or..

hykkingking的博客 765
上一篇: canal之高可用架构设计与应用
下一篇: Java邮箱地址无效导致群发邮件失败的解决方案
javaee_sunny
博客等级 码龄11年 90粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值