`
fantaxy025025
  • 浏览: 1308988 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

JedisConnectionException: java.net.SocketException: Socket closed;Unknown reply:

 
阅读更多

 

JedisConnectionException: java.net.SocketException: Socket closed;Unknown reply: ; It seems like server has closed the connection.解决办法

       最近在使用Jedis pool的时候,写好的servlet程序一经高并发的测试,就会抛出各种Exception,像JedisConnectionException: java.net.SocketException: Socket closed;Unknown reply: ; It seems like server has closed the connection.等等。在网上查了好多资料,很多都说和Redis的timeout的默认设置有关,timeout默认设置是300s,一个redis socket连接超过这个时限,但没有对redis做任何操作的话,redis server就会主动关闭了这个连接。一种解决办法是将timeout设置为0(无限制)就行了。

  由于一些因素,redis一直无法设置然后进行重启。然后我就在timeout=300s的情况下,做了各种尝试,保证既可以使用jedis pool又不会在高并发的时候出错。怪我查找资料不力,一直没有找到解决的办法,只能放弃使用连接池,每次函数调用就new一个jedis对象,然后对redis进行操作。这种方法要注意:jedis.disconnect().这种方式下,虽然在高并发的时候会对redis server造成压力,但很稳定速度也挺快的。

  后来再次试图解决之前的问题的时候,发现Jedis pool 还有两个参数: TestOnBorrow,在borrow一个jedis实例时,是否提前进行validate操作,如果为true,则得到的jedis实例均是可用的;TestOnReturn,在return一个jedis实例时,是否提前进行validate操作.

  设置了这两个参数以后,问题就得到解决了,做并发测试没有什么问题。

 [cpp] view plain copy

 
  1. //jedis pool 设置  
  2.     public static JedisPool pool;  
  3.     static{  
  4.         JedisPoolConfig config = new JedisPoolConfig();  
  5.         config.setMaxActive(con.getIntValue("redis.maxActive", 300));  
  6.         config.setMaxIdle(con.getIntValue("redis.maxIdle", 10));  
  7.         //config.setMinIdle(10);  
  8.         config.setMaxWait(con.getLongValue("redis.maxWait", 1000L));  
  9.         config.setTestOnBorrow(true);  
  10.         config.setTestOnReturn(true);  
  11.         //config.testWhileIdle=true;  
  12.         //config.minEvictableIdleTimeMillis=30000;  
  13.         //config.timeBetweenEvictionRunsMillis=30000;  
  14.           
  15.         pool = new JedisPool(config, redisaddr, redisport);  
  16.     }  
[cpp] view plain copy
 
  1. //获取jedis pool 对象  
  2.        try{  
  3.                 jee= pool.getResource();  
  4.             }catch(JedisConnectionException e){  
  5.                 pool.returnBrokenResource(jee);  
  6.             }  
  7.         //读取redis  
  8.             if(jee!=null){  
  9.                 try{  
  10.                     stationList=jee.lrange("trps:lineinfo", 0, -1);  
  11.                 } catch (Exception e) {  
  12.                       
  13.                     pool.returnBrokenResource(jee);  
  14.                 } finally{  
  15.                     if(null != jee){  
  16.                         pool.returnResource(jee);  
  17.                     }  
  18.                 }  
  19.             }  

from:http://blog.csdn.net/wangzaizhen2009/article/details/50592826?locationNum=13&fps=1

 

文:Redis : It seems like server has closed the connection

Small problem : redis.clients.jedis.exceptions.JedisConnectionException: It seems like server has closed the connection.

At first ,I Don’t have to configure redis-config # maxclients

So , Get me wrong this problem

But ,  redis — info

# Clients

connected_clients:2

this is a bad idea , really, when redis server send back “Protocol error” message , the server will close socket; but jedis Protocol.java just throw a JedisDataException exception and ignored tcp close segment; so if you reuse this connection, jedis will throw an exception with “It seems like server has closed the connection” message.

maxidletime default value is five minutes,the server will continue to cycle detection clinet last communication time, if more than ,close and return source.then,the client sends the data to the server and problem occurs.

final solution : config.setTestOnBorrow(true);

 

中文:http://www.chepoo.com/jedis-connection-exception-it-seems-like-server-has-closed-the-connection.html

看提示,应该是服务端主动关闭了连接。查看线上redis服务器的配置的timout选项:

# Close the connection after a client is idle for N seconds (0 to disable)
timeout 30

该配置指的是客户端连接空闲超过多少秒后,服务端主动关闭连接,默认值0表示服务端永远不主动关闭。客户端使用了一个连接池管理访问redis的所有连接,这些连接是长连接,当业务量较小时,客户端部分连接使用率较低,当两次使用之间的间隔超过30秒时,redis服务端就主动关闭了这个连接,而等客户端下次再使用这个连接对象时,发现服务端已经关闭了连接,进而报错。

连接池setTimeBetweenEvictionRunsMillis(60000);// 失效检查线程运行时间间隔,如果小于等于0,不会启动检查线程 每隔1分钟检查一下连接池建立的连接。

解决方案:把timeout值大于60s即可。改为300,问题解决。

 

+

+

+

=

=

=

 

分享到:
评论

相关推荐

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法

    JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES解决方法 JAVA.NET.SOCKETEXCEPTION TOO MANY OPEN FILES错误是一种常见的网络编程错误,发生在Java应用程序中, especialmente 在 Linux 操作系统中。该错误的出现是...

    在Win7系统下抛出java.net.SocketException的解决办法

    ### 在Win7系统下抛出java.net.SocketException的解决办法 #### 问题背景及原因分析 在使用MyEclipse开发工具结合JBoss服务器进行项目开发的过程中,遇到一个常见但令人头疼的问题:当启动JBoss服务器时,控制台...

    java.net.SocketException Connection reset 解决方法

    "java.net.SocketException Connection reset 解决方法" 在 Java 编程中,SocketException 是一种常见的异常,特别是在网络编程中。Conexion reset by peer 是一种特殊的 SocketException,它发生在客户端和服务器...

    java.net.SocketException: No route to host 异常原因

    NULL 博文链接:https://zhoudan241.iteye.com/blog/1432014

    java.net.SocketException: Connection reset 解决方法

    Java中的`java.net.SocketException: Connection reset`是一个常见的网络编程错误,通常表示在TCP/IP通信过程中,连接突然中断。这个异常可能在客户端或服务器端发生,通常与数据传输的异常中断有关。 首先,我们来...

    http接口调用报错.rar

    接口调用报错:java.net.SocketException: java.lang.ClassNotFoundException: Cannot find the specified class com.ibm.websphere.ssl.protocol.SSLSocketFactory

    connection reset解决方案(亲测可用).md

    connection reset解决方案(亲测可用).md

    C#socket通讯两个最经典错误解决方案

    对象名:“System.Net.Sockets.Socket” **问题现场** 在实际编程过程中,有时会出现以下异常:“无法访问已释放的对象。对象名:“System.Net.Sockets.Socket”。这种错误通常发生在对已经关闭的 Socket 进行操作时...

    Java Socket常见异常处理

    3. **java.net.SocketException: Socket is closed** 当Socket主动关闭后,尝试进行读写操作时,会出现这个异常。为避免此类问题,确保在完成通信后正确关闭Socket,并在处理Socket对象时检查其状态。 4. **java...

    Linux下打开的文件过多错误

    Linux下运行tomcat或者was出现java.net.SocketException: 打开的文件过多错误 tomcat报“too many open files”的错误,解决办法如下:

    Hive2Hive-master.rar

    在Java中,Socket类和ServerSocket类分别用于客户端和服务端的通信建立。 2. **Hive数据同步需求**: 在大数据环境中,数据的实时同步是非常关键的。例如,当一个Hive集群中的数据发生变化时,可能需要将这些变化...

    java网络编程示例

    import java.net.Socket; public class TCPServer { public static void main(String[] args) { try { ServerSocket socket = new ServerSocket(4444); while (true) { Socket sc =socket.accept()...

    Windows10/11 USB驱动

    System.Net.Sockets.SocketException (10061): 由于目标计算机积极拒绝,无法连接。 at System.Net.Sockets.Socket.AwaitableSocketAsyncEventArgs.ThrowException(SocketError error, CancellationToken ...

    fastdfs使用java

    在Java中使用FastDFS,首先需要在项目中引入FastDFS的Java客户端库。配置client.conf文件,设置tracker服务器的地址和其他相关参数。接着创建FastdfsClient和FastdfsUtil类,前者用于与FastDFS服务器通信,后者封装...

    ip6-java.zip

    2. **Socket编程**:使用`java.net.Socket`和`java.net.ServerSocket`类进行网络通信。对于IPv6,这两个类也支持IPv6地址,只需提供相应的IPv6地址即可。 3. **MulticastSocket**:Java的`java.net.MulticastSocket...

    Socket长连接异常处理

    java.net.SocketException: Socket is closed 该异常可能发生在客户端和服务器端,原因是主动关闭了连接后继续对网络连接进行读写操作。解决方法是确保在关闭连接前完成所有的数据传输。 java.net.SocketException...

    Ice-3.7.4.msi for windows版

    at Ice.ConnectionI$SocketReadyCallback.socketReady(ConnectionI.java:2299) at IceInternal.SelectorThread.run(SelectorThread.java:203) at IceInternal.SelectorThread$HelperThread.run(SelectorThread....

    如何解决线程太多导致java socket连接池出现的问题

    3. 错误信息:当Socket连接池出现问题时,可能会出现错误信息,如"java.net.SocketException: No buffer space available (maximum connections reached?): listen failed"。 解决方法 要解决线程太多导致Socket...

    Java实现modbus tcp协议数据读写,项目内包含modbus slave仿真软件

    本项目专注于使用Java语言实现Modbus TCP/IP协议的读写功能,提供了两种不同的实现方案:jlibmodbus和modbus4j库。这两种库都是Java社区开发的开源工具,专门用于处理Modbus通信。 首先,我们来看jlibmodbus。...

    Google I/O 2013推荐Android 网络通信框架Volley

    ```java RequestQueue queue = Volley.newRequestQueue(this); ``` 2. 创建Request对象:根据实际需求创建对应的Request子类,如StringRequest、JsonArrayRequest等。 ```java String url = ...

Global site tag (gtag.js) - Google Analytics