Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Data MongoDB中处理读取超时的最佳方法_Java_Spring_Mongodb_Spring Data_Spring Data Mongodb - Fatal编程技术网

Java Spring Data MongoDB中处理读取超时的最佳方法

Java Spring Data MongoDB中处理读取超时的最佳方法,java,spring,mongodb,spring-data,spring-data-mongodb,Java,Spring,Mongodb,Spring Data,Spring Data Mongodb,因此,我们不时会看到这样的例外情况: java.net.SocketTimeoutException: Read timed out at java.net.SocketInputStream.socketRead0(Native Method) at java.net.SocketInputStream.read(SocketInputStream.java:150) at java.net.SocketInputStream.read(SocketInputStream.java:121)

因此,我们不时会看到这样的例外情况:

java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:150)
at java.net.SocketInputStream.read(SocketInputStream.java:121)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
at org.bson.io.Bits.readFully(Bits.java:48)
at org.bson.io.Bits.readFully(Bits.java:35)
at org.bson.io.Bits.readFully(Bits.java:30)
at com.mongodb.Response.<init>(Response.java:42)
at com.mongodb.DBPort$1.execute(DBPort.java:141)
at com.mongodb.DBPort$1.execute(DBPort.java:135)
at com.mongodb.DBPort.doOperation(DBPort.java:164)
at com.mongodb.DBPort.call(DBPort.java:135)
at com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:292)
at com.mongodb.DBTCPConnector.call(DBTCPConnector.java:271)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84)
at com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66)
at com.mongodb.DBCollection.findOne(DBCollection.java:870)
at com.mongodb.DBCollection.findOne(DBCollection.java:844)
at com.mongodb.DBCollection.findOne(DBCollection.java:790)
at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2000)
java.net.SocketTimeoutException:读取超时
位于java.net.SocketInputStream.socketRead0(本机方法)
位于java.net.SocketInputStream.read(SocketInputStream.java:150)
位于java.net.SocketInputStream.read(SocketInputStream.java:121)
在java.io.BufferedInputStream.fill处(BufferedInputStream.java:246)
位于java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
在java.io.BufferedInputStream.read处(BufferedInputStream.java:345)
阅读org.bson.io.Bits.readfull(Bits.java:48)
阅读org.bson.io.Bits.readfull(Bits.java:35)
阅读org.bson.io.Bits.readfull(Bits.java:30)
位于com.mongodb.Response(Response.java:42)
位于com.mongodb.DBPort$1.execute(DBPort.java:141)
位于com.mongodb.DBPort$1.execute(DBPort.java:135)
位于com.mongodb.DBPort.doOperation(DBPort.java:164)
在com.mongodb.DBPort.call上(DBPort.java:135)
位于com.mongodb.DBTCPConnector.innerCall(DBTCPConnector.java:292)
在com.mongodb.DBTCPConnector.call上(DBTCPConnector.java:271)
位于com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:84)
位于com.mongodb.DBCollectionImpl.find(DBCollectionImpl.java:66)
位于com.mongodb.DBCollection.findOne(DBCollection.java:870)
位于com.mongodb.DBCollection.findOne(DBCollection.java:844)
位于com.mongodb.DBCollection.findOne(DBCollection.java:790)
位于org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2000)
在代码中处理和恢复这些数据的最佳方法是什么?
我们是否需要在每个mongodb调用周围都设置一个“重试”选项?

处理重试的众多选项之一是Spring retry项目

它为Spring应用程序提供声明式重试支持。
这就是这个问题的基本答案。它用于Spring批处理、Spring集成、Spring for Apache Hadoop(以及其他)中。

您可以使用MongoClientOptions对象设置不同的可选连接参数。您正在考虑设置心跳频率,以确保驱动程序重试连接。还要设置套接字超时,以确保它不会持续太长时间

  • MinHeartbeatFrequency:如果驱动程序必须频繁地重新检查服务器的可用性,它将至少在上次检查之后等待这么长时间,以避免浪费精力。默认值为10ms
  • HeartbeatSocketTimeout:心跳检查超时
  • SocketTimeout:连接超时
  • 为了避免太多的代码重复,您可以选择遵循下面给出的一些模式。 基本思想是避免任何数据库连接相关的配置在项目中随处可见

    /**
     * This class is an abstraction for all mongo connection config
     **/
     @Component
     public class MongoConnection{
    
        MongoClient mongoClient = null;
    
        ...
    
       @PostConstruct
       public void init() throws Exception {
                // Please watch out for deprecated methods in new version of driver.
                mongoClient = new MongoClient(new ServerAddress(url, port), 
                                MongoClientOptions.builder()
                                .socketTimeout(3000)
                                .minHeartbeatFrequency(25)
                                .heartbeatSocketTimeout(3000)
                                .build());
                mongoDb = mongoClient.getDB(db);
            .....   
       }
    
       public DBCollection getCollection(String name) {
            return mongoDb.getCollection(name);
        }
       }
    
    现在您可以在DAO-s中使用MongoConnection

    @Repository
    public class ExampleDao{
    
      @Autowired
      MongoConnection mongoConnection;
    
      public void insert(BasicDBObject document) {
         mongoConnection.getCollection("example").insert(document);
      }  
    }
    

    您还可以在MongoConnection中实现所有数据库操作,以全面引入一些通用功能。例如,为所有“插入”添加日志记录如果您不仅要解决MongoDB的超时(和相关)问题,还要解决任何其他外部引用的超时(和相关)问题,那么您应该尝试Netflix的Hystrix()


    这是一个非常棒的库,它与RX和异步处理很好地集成在一起,而异步处理最近变得非常流行。

    如果我没有弄错的话,我认为在尝试建立连接或在连接池中准备好它们时,您需要配置您的属性,例如超时等等。
    或者,您可以只检查您的网络或计算机,并将请求数据拆分多次以减少网络传输时间。

    是您处理依赖关系的工具。

    可能是您应该查看哪个查询导致SocketTimeout连接,因为当套接字超时异常发生时,只有您的连接将关闭,但服务器(mongo)将关闭将继续处理查询,直到查询完成。每次都是不同的查询