java处理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)
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)
在代码中处理和恢复这些数据的最佳方法是什么? 我们是否需要对每个mongodb调用进行“重试”
# 1 楼答案
处理重试的众多选项之一是SpringRetry项目
https://github.com/spring-projects/spring-retry
它为Spring应用程序提供声明式重试支持。 这就是这个问题的基本答案。它用于Spring批处理、Spring集成、Spring for Apache Hadoop(以及其他)
# 2 楼答案
可以使用MongoClientOptions对象设置不同的可选连接参数。您正在考虑设置心跳频率,以确保驱动程序重试连接。还要设置套接字超时,以确保它不会持续太长时间
Reference API
为了避免太多的代码重复,您可以选择遵循下面给出的一些模式。 基本思想是避免任何数据库连接相关的配置在项目中随处可见
现在可以在DAO-s中使用MongoConnection
您还可以在MongoConnection中实现所有数据库操作,以全面引入一些通用功能。例如,为所有“插入”添加日志记录
# 3 楼答案
https://github.com/Netflix/Hystrix是处理依赖关系的工具
# 4 楼答案
如果我没弄错的话,我认为当你试图建立连接或者只是在连接池中准备好它们时,你需要配置你的属性,比如超时等等。 或者,您可以只检查您的网络或计算机,并将请求数据拆分多次,以减少网络传输时间
# 5 楼答案
如果您不仅想解决MongoDB的超时(以及相关)问题,还想解决任何其他外部引用的超时(以及相关)问题,那么您应该尝试Netflix的Hystrix(https://github.com/Netflix/Hystrix)
这是一个很棒的库,它与RX和异步处理很好地集成在一起,而异步处理最近变得非常流行