InfluxDBIOException: java.net.SocketTimeoutException: время ожидания
Я использую Java-упаковку Influx Db и добавляю данные в приток базы данных каждые 5 секунд с политикой хранения 30 дней.
Когда я пытаюсь запросить данные, отправив несколько запросов, возникает исключение тайм-аута. Как только я очищаю данные БД, ответ получен правильно.
org.influxdb.InfluxDBIOException: java.net.SocketTimeoutException: timeout
at org.influxdb.impl.InfluxDBImpl.execute(InfluxDBImpl.java:587)
at org.influxdb.impl.InfluxDBImpl.query(InfluxDBImpl.java:425)
**at services.SampleService.getTotalCount(SampleService.kt:45)**
at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at ninja.params.ControllerMethodInvoker.invoke(ControllerMethodInvoker.java:76)
at ninja.FilterChainEnd.next(FilterChainEnd.java:45)
at filters.PermissionFilter.filter(PermissionFilter.kt:30)
at ninja.FilterChainImpl.next(FilterChainImpl.java:36)
at filters.JwtFilter.filter(JwtFilter.kt:40)
at ninja.FilterChainImpl.next(FilterChainImpl.java:36)
at filters.CorsFilter.filter(CorsFilter.kt:10)
at ninja.FilterChainImpl.next(FilterChainImpl.java:36)
at ninja.NinjaDefault.onRouteRequest(NinjaDefault.java:102)
at ninja.servlet.NinjaServletDispatcher.service(NinjaServletDispatcher.java:86)
at com.google.inject.servlet.ServletDefinition.doServiceImpl(ServletDefinition.java:286)
at com.google.inject.servlet.ServletDefinition.doService(ServletDefinition.java:276)
at com.google.inject.servlet.ServletDefinition.service(ServletDefinition.java:181)
at com.google.inject.servlet.ManagedServletPipeline.service(ManagedServletPipeline.java:91)
at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:85)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:120)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:135)
at ninja.servlet.NinjaServletFilter.doFilter(NinjaServletFilter.java:106)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1759)
at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:582)
at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1180)
at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:512)
at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1112)
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:134)
at org.eclipse.jetty.server.Server.handle(Server.java:534)
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:320)
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:283)
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
at org.eclipse.jetty.io.SelectChannelEndPoint$2.run(SelectChannelEndPoint.java:93)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.executeProduceConsume(ExecuteProduceConsume.java:303)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.produceConsume(ExecuteProduceConsume.java:148)
at org.eclipse.jetty.util.thread.strategy.ExecuteProduceConsume.run(ExecuteProduceConsume.java:136)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:671)
at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:589)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.SocketTimeoutException: timeout
at okio.Okio$4.newTimeoutException(Okio.java:232)
at okio.AsyncTimeout.exit(AsyncTimeout.java:285)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:241)
at okio.RealBufferedSource.request(RealBufferedSource.java:68)
at okio.RealBufferedSource.require(RealBufferedSource.java:61)
at okio.RealBufferedSource.readHexadecimalUnsignedLong(RealBufferedSource.java:304)
at okhttp3.internal.http.Http1xStream$ChunkedSource.readChunkSize(Http1xStream.java:441)
at okhttp3.internal.http.Http1xStream$ChunkedSource.read(Http1xStream.java:422)
at okio.RealBufferedSource.read(RealBufferedSource.java:47)
at okio.RealBufferedSource.request(RealBufferedSource.java:68)
at okio.RealBufferedSource.require(RealBufferedSource.java:61)
at okio.GzipSource.consumeHeader(GzipSource.java:114)
at okio.GzipSource.read(GzipSource.java:73)
at okio.RealBufferedSource.read(RealBufferedSource.java:47)
at okio.ForwardingSource.read(ForwardingSource.java:35)
at retrofit2.OkHttpCall$ExceptionCatchingRequestBody$1.read(OkHttpCall.java:279)
at okio.RealBufferedSource.request(RealBufferedSource.java:68)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:418)
at okio.RealBufferedSource.rangeEquals(RealBufferedSource.java:402)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:39)
at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:25)
at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
at org.influxdb.impl.InfluxDBImpl.execute(InfluxDBImpl.java:579)
... 46 more
Caused by: java.net.SocketException: Socket closed
at java.net.SocketInputStream.read(SocketInputStream.java:204)
at java.net.SocketInputStream.read(SocketInputStream.java:141)
at okio.Okio$2.read(Okio.java:140)
at okio.AsyncTimeout$2.read(AsyncTimeout.java:237)
Причина исключения указывает на эту строкуval results = influxDB.query(q)
val q = Query(
"select sum(firstCount) as totalFirstCount, sum(secondCount) as totalSecondCount" +
" ,sum(thirdCount) as totalThirdCount, sum(fourthCount) as totalFourthCount " +
"from counters where time > now() - "1h" group by field1 , field2",
"dbname")
Все значения поля имеют тип Long и имеют значения, такие как 2721976000.
Ниже приведен ответ из объяснения вышеупомянутого запроса.
ВЫРАЖЕНИЕ: сумма (firstCount::integer) КОЛИЧЕСТВО ЧАСТЕЙ: 123 КОЛИЧЕСТВО СЕРИЙ: 26568 ЗАПИСАННЫЕ ЗНАЧЕНИЯ: 105408 КОЛИЧЕСТВО ФАЙЛОВ: 16200 КОЛИЧЕСТВО БЛОКОВ: 16200 РАЗМЕР БЛОКОВ: 76693173
ВЫРАЖЕНИЕ: сумма (secondCount::integer) НОМЕР ЧАСТЕЙ: 123 НОМЕР СЕРИИ: 26568 КЭШЕНОЗНЫЕ ЗНАЧЕНИЯ: 105408 НОМЕР ФАЙЛОВ: 16200 НОМЕР БЛОКОВ: 16200 РАЗМЕР БЛОКОВ: 86133364
ВЫРАЖЕНИЕ: сумма (thirdCount::integer) КОЛИЧЕСТВО ЧАСТЕЙ: 123 КОЛИЧЕСТВО СЕРИЙ: 26568 КЭШЕНОЧНЫЕ ЗНАЧЕНИЯ: 105408 КОЛИЧЕСТВО ФАЙЛОВ: 16200 КОЛИЧЕСТВО БЛОКОВ: 16200 РАЗМЕР БЛОКОВ: 61967770
ВЫРАЖЕНИЕ: сумма (2ndCount:: integer) ЧИСЛО ЧАСТЕЙ: 123 ЧИСЛО СЕРИИ: 26568 КЭШЕНОЗНЫЕ ЗНАЧЕНИЯ: 105408 ЧИСЛО ФАЙЛОВ: 16200 ЧИСЛО БЛОКОВ: 16200 РАЗМЕР БЛОКОВ: 61967754
Я не смог найти решение для устранения исключения, в журналах консоли Java ответ получен правильно. Любые указатели, чтобы посмотреть на оптимизацию запроса или причину исключения, были бы полезны.
3 ответа
Я изменил тайм-аут по умолчанию для OKHttpClient, и исключения не были выброшены в течение определенного периода времени. Пропустил раньше, так как я прошел другой экземпляр БД.
val client = OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.retryOnConnectionFailure(true)
val influxConnection = InfluxDBFactory.connect("http://localhost:8086", client)
Я перевожу ответ @Nirmal на Java
OkHttpClient.Builder client = new OkHttpClient.Builder()
.connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1, TimeUnit.MINUTES)
.writeTimeout(1, TimeUnit.MINUTES)
.retryOnConnectionFailure(true);
InfluxDB influxdb = InfluxDBFactory.connect(influxUrl, client);
Более простой подход с более новыми клиентами (я тестировал 6.0): вы можете добавить к URL-адресу
?readTimeout=1m&connectTimeout=1m&writeTimeout=30s
По умолчанию 10 с. См. JavaDoc
com.influxdb.client.InfluxDBClientFactory#create(java.lang.String, char[], java.lang.String)