java使用线程 *** 作,等待线程后续时间过长报超时异常,如何 *** 作使线程推出数据后即算线程 *** 作结束

java使用线程 *** 作,等待线程后续时间过长报超时异常,如何 *** 作使线程推出数据后即算线程 *** 作结束,第1张

java中使用用线程控制Task任务,启动下面的线程就可以了,new Thread(new Task())start() ;public class

Task implements Runnable {//新建一个任务

private TextArea textArea;

public Task(TextArea textArea){

thistextArea = textArea;

}

public void run() {

while (true) {

thistextAreasetText("这里设置: 输出的一段文字");

try {

Threadsleep(500); // 这里设置:隔多长时间

} catch (Exception e) {

eprintStackTrace();

}

}

}

}

String SysUserName = (String)SessionUtilsgetAttribute(request, "UserName");

if((SysUserName==null)||(SysUserNameequals("")))

{

%>

<jsp:forward page="sessiontimeoutjsp"/>

<%

}

以上例子是获取 SysUserName 的 session 如果为空,则说明超时了。

应该是redis本身的服务有问题了

本文所针对的连接超时问题所涉及的相关元素如下:

Redis客户端: Jedis (java)

Redis版本 :2812

Redis部署 *** 作系统类型:Linux

正文开始:

No 1Redis执行大命令(时间复杂度为O(N)的命令)

问题剖析:

aRedis服务器端通过单线程处理命令,一旦有大命令被执行,Redis将无法及时响应来自客户端的任何命令

关于Redis大命令的监控,可以查看slowlog来观察

b在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a尽量避免使用时间复杂度为O(N)的命令

b如果无法避免使用时间复杂度为O(N)的命令,则应降低其使用频率,避免在业务高峰期时使用

No 2Redis单次 *** 作数据包过大

问题分析

a单次 *** 作数据包过大,且 *** 作频繁,极有可能会导致网络拥堵

b在使用jedis作为redis客户端时,当redis连接池的配置参数testOnBorrow=true时,默认会在获取redis连接

时,先执行redis的ping方法,而基于原因a,此时redis将无法及时响应,自然会报出time out异常

如何解决:

a排查代码,确定是否存在大数据(数据条目过多/单条数据过大) *** 作,将其进行改造,改造方案有两个:

a1数据拆分,变更数据类型(常见的情况是将java中的collection类型序列化后存入redis的String数据

类型中),如将String数据类型调整为hash/list/set等,这常用于解决单条数据量过大的情况

a2调整业务逻辑,减少单次数据查询范围(常见的情况如将redis中的整个hash数据取回,在应用程序内存中获取需要的entry),如使用hget等单条查询命令替换hgetall命令

以上就是关于java使用线程 *** 作,等待线程后续时间过长报超时异常,如何 *** 作使线程推出数据后即算线程 *** 作结束全部的内容,包括:java使用线程 *** 作,等待线程后续时间过长报超时异常,如何 *** 作使线程推出数据后即算线程 *** 作结束、如何捕捉Session的超时机制问题 java、java连接redis超时问题怎么解决等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9506192.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存