谁在这里为公园州的线程提供许可?

时间:2017-07-13 16:05:55

标签: multithreading tcp redis jedis request-timed-out

我在jedis的帮助下连接我的redis。而jedis池的初始化就像是,

JedisPool pool = new JedisPool("<redis_server_ip_address>");    

和redis get call就像

Jedis jedis = pool.getResource();
jedis.get(key);

因此,这里使用默认池配置

初始化池
  • 读取超时(默认值为2秒)
  • 默认端口(6387)
  • 最大有效连接8

此池初始化具有正确的ip值和默认池配置。当在初始化期间给出一些不正确的ip值时Jedis无法找到不正确的ip值,因此在pool.getResource()调用期间,线程进入等待状态,即;将建立连接,并且当请求超过maxactiveconnections的{​​{1}}的{​​{1}}时,进一步redis get class的线程将进入线程8 halt状态。这意味着线程既没有提供执行,也没有选择在队列中等待 - 这将被推送到暂停状态,并且处于暂停状态的线程的线程转储样本如下所示

WAITING

线程将处于暂停状态,直到先前尝试连接redis的请求完成并调用此等待线程(即;当它 Thread 956: (state = IN_NATIVE) - java.net.PlainSocketImpl.socketConnect(java.net.InetAddress, int, int) @bci=0 (Interpreted frame) - java.net.AbstractPlainSocketImpl.doConnect(java.net.InetAddress, int, int) @bci=64, line=350 (Interpreted frame)java.net.AbstractPlainSocketImpl.connectToAddress(java.net.InetAddress, int, int) @bci=23, line=206 (Interpreted frame) - java.net.AbstractPlainSocketImpl.connect(java.net.SocketAddress, int) @bci=78, line=188 (Interpreted frame) - java.net.SocksSocketImpl.connect(java.net.SocketAddress, int) @bci=381, line=392 (Interpreted frame) - java.net.Socket.connect(java.net.SocketAddress, int) @bci=179, line=589 (Interpreted frame) - redis.clients.jedis.Connection.connect() @bci=74, line=144 (Interpreted frame) - redis.clients.jedis.BinaryClient.connect() @bci=8, line=71 (Compiled frame) - redis.clients.jedis.BinaryJedis.connect() @bci=4, line=1783 (Interpreted frame) - redis.clients.jedis.JedisFactory.makeObject() @bci=21, line=65 (Interpreted frame) - org.apache.commons.pool2.impl.GenericObjectPool.create() @bci=47, line=836 (Interpreted frame) - org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(long) @bci=92, line=434 (Compiled frame) - org.apache.commons.pool2.impl.GenericObjectPool.borrowObject() @bci=5, line=361 (Compiled frame) - redis.clients.util.Pool.getResource() @bci=4, line=40 (Compiled frame) - redis.clients.jedis.JedisPool.getResource() @bci=1, line=84 (Compiled frame) - com.project.SampleRedisClient.getJedis() @bci=41, line=53 (Interpreted frame) - com.project.SampleRedisClient.getDataFromRedis(java.lang.String) @bci=27, line=99 (Interpreted frame) 调用这些等待线程时)

所以,我所做的只是添加interupt(),用于在连接redis时设置其他配置。我正在添加JedisPoolConfig,允许我设置等待时间。因此,将为处于maxWaitSeconds等待状态的线程设置超时。这解决了我延长线程等待的问题(正如我的线程转储堆栈跟踪显示)。

最新的halt池初始化如下所示,

Jedis

那么,这个JedisPool配置是什么。这String host = docsRedisProp.getProperty("redisserver"); int port = 6379; int maxActiveConnections = 8; int maxWaitInMillis = 2000; JedisPoolConfig jedisConfig = new JedisPoolConfig(); jedisConfig.setMaxTotal(maxActiveConnections); jedisConfig.setMaxWaitMillis(maxWaitInMillis); pool = new JedisPool(jedisConfig, host, port); 到底是做什么的?

当ip不正确时,线程会有什么机会连接?什么是连接状态?这里的连接是JedisPoolConfig.setMaxWaitMillis还是ESTABLISHED状态?

这些连接何时关闭(即;有机会连接到redis ip的线程)?

如何通过terminal命令查看当前建立到redis服务器的总连接?

这个OPEN是指什么?这是否一次只允许最多maxActiveConnections个连接?

使用以下终端命令

  

netstat -a -n -p -l | grep&#34;&#34;

有了这个,当正确给出redis ip值时,我可以找到几个处于8状态的连接。

0 个答案:

没有答案