为什么使用oracle反应式客户端时,为什么vert.x块事件循环线程
我尝试用户 vert.x vert.x vertive oferace oferace client 4.2.6避免在事件循环中阻止线程。 我决定测试一个非常长的查询:
GlobalScope.launch(vertx.dispatcher()) {
val result = hubConnPool.preparedQuery("""select * from MDM_OKATO_TT""")
.execute()
.onComplete { println("completed") }
.onFailure { it.printStackTrace() }
}
但是不幸的是,我在控制台上收到了这样的警告:
[vertx阻止螺纹检查 - 检查器]警告 io.vertx.core.impl.BlockedThreadChecker-线程 线程[vert.x-eventloop-thread-1,5,main]已被阻塞6866毫秒, 时间限制为2000 ms io.vertx.core.core.vertxexception:线程被阻止 [email  procectioned]方法) .Java:43) 在 .Java:276) at ioutil.java:245) .Java:223)at .Java:355) 在 app // app // oracle.net.nt.timeoutsocketchannel.read(timeoutsocketchannel.java:416) 在 App // Oracle.net.ns.ns.nsprotocolnio.dosocketRead(nsprotocolnio.java:1119) 在App // Oracle.net.ns.n.niopacket.readheader(niopacket.java:267)at App // Oracle.net.ns.n.niopacket.readpacketfromsocketchannel(niopacket.java:199) 在 App // Oracle.net.ns.ns.niopacket.ReadFromsocketchannel(niopacket.java:141) 在 app // oracle.net.ns.n.niopacket.readfromsocketchannel(niopacket.java:114) 在 App // Oracle.net.ns.ns.nionsdatachannel.readdatafromsocketchannel(nionsdatachannel.java:98) 在 App // Oracle.jdbc.driver.t4cmarenginio.prepareforunmarshall(t4cmarenginio.java:834) 在 App // Oracle.jdbc.driver.t4cmarenginio.unmarshalub1(t4cmarenginio.java:487) at App // oblecle.jdbc.driver.t4cttifun.receive(t4cttifun.java:623)at App // Oracle.jdbc.driver.t4cttifun.dorpc(t4cttifun.java:299)at App // Oracle.jdbc.driver.t4c8oall.dooall(t4c8oall.java:512)at App // Oracle.jdbc.driver.t4cpreparedstatement.dooall8(t4cpreparedstatement.java:163) 在 App // Oracle.jdbc.driver.t4cpreparedstatement.fetch(t4cpreparedstatement.java:1467) 在 App // Oracle.jdbc.driver.oraclestatement.fetchmorerows(oraclestatement.java:4127) 在 App // Oracle.jdbc.driver.insensitivesCrollablEresultset.fetchmorerows(insensitivesCrollablerEultset.java:924) 在 App // Oracle.jdbc.driver.insensitivesCrollablEresultset.fetchNextrows(insensitivesCrollablerElsultset.java:831) 在 App // Oracle.jdbc.driver.insensitivesCrollablEresultset.AbsoluteInternal(insensitivesCrollablerEsultset.java:803) 在 App // Oracle.jdbc.driver.insensitivesCrollablerEsultset.next(insensitivesCrollablerElesultset.java:504) 在 app // io.vertx.oracleclient.impl.commands.querycommand.decoderesultset(querycommand.java:216) 在 app // io.vertx.oracleclient.impl.commands.querycommand.decode(querycommand.java:165) 在 app // io.vertx.oracleclient.impl.commands.oraclepreparedquery.lambda $ doexecute $ 0(oraclepreparedquery.java:77) 在 app // io.vertx.oracleclient.impl.commands.oraclepreparedquery $$ lambda $ 242/0x000000000001003694440.Apply(未知 来源) app // io.vertx.core.impl.future.composition.onsuccess(coptions.java:38) 在 app // io.vertx.core.impl.future.futurebase.emitsuccess(funebase.java:60) 在 app // io.vertx.core.impl.future.futureimpl.trycomplete(futureimpl.java:211) 在 app // io.vertx.core.impl.future.promiseimpl.trycomplete(Promiseimpl.java:23) 在 app // io.vertx.oracleclient.impl.helper $ 1.lambda $ onnext $ 0(helper.java:94) 在 app // io.vertx.oracleclient.impl.helper $ 1 $$ lambda $ 259/0x0000000100391440.Handle(Unknown 来源) app // io.vertx.core.impl.abstractcontext.dispatch(AbstractContext.java:100) 在 app // io.vertx.core.impl.abstractcontext.dispatch(AbstractContext.java:63) 在 app // io.vertx.core.impl.eventloopcontext.lambda $ runoncontext $ 0(eventloopcontext.java:38) 在 app // io.vertx.core.impl.eventloopcontext $$ lambda $ 121/0x000000010023fc40.run(未知 来源) app // io.netty.util.concurrent.abstracteventexecutor.safeexecute(AbstractEventExecutor.java:164) 在 app // io.netty.util.concurrent.singlethreadeventexecutor.runalltasks(singlethreadeventexecutor.java:469) 在app // io.netty.channel.nio.nioeventloop.run(nioeventloop.java:503) 在 app // io.netty.util.concurrent.singlethreadeventexecutor $ 4.run(singlethreadeventexecutor.java:986) 在 app // io.netty.util.internal.threadexecutormap $ 2.run(threadexecutormap.java:74) 在 app // io.netty.util.concurrent.fastthreadlocalrunnable.run(fastthreadlocalrunnable.java:30)
到目前为止,我正在使用workerexecutor运行的JDBC客户端。你能建议我我做错了什么或被误解了吗?谢谢。
I try to user Vert.x Reactive Oracle Client version 4.2.6 to avoid blocking threads in event loop.
I decided to test a really long query:
GlobalScope.launch(vertx.dispatcher()) {
val result = hubConnPool.preparedQuery("""select * from MDM_OKATO_TT""")
.execute()
.onComplete { println("completed") }
.onFailure { it.printStackTrace() }
}
But unfortunatelly I got such warnings in my console:
[vertx-blocked-thread-checker] WARN
io.vertx.core.impl.BlockedThreadChecker - Thread
Thread[vert.x-eventloop-thread-1,5,main] has been blocked for 6866 ms,
time limit is 2000 ms io.vertx.core.VertxException: Thread blocked at
[email protected]/sun.nio.ch.SocketDispatcher.read0(Native Method) at
[email protected]/sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)
at
[email protected]/sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)
at [email protected]/sun.nio.ch.IOUtil.read(IOUtil.java:245) at
[email protected]/sun.nio.ch.IOUtil.read(IOUtil.java:223) at
[email protected]/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:355)
at
app//oracle.net.nt.TimeoutSocketChannel.read(TimeoutSocketChannel.java:416)
at
app//oracle.net.ns.NSProtocolNIO.doSocketRead(NSProtocolNIO.java:1119)
at app//oracle.net.ns.NIOPacket.readHeader(NIOPacket.java:267) at
app//oracle.net.ns.NIOPacket.readPacketFromSocketChannel(NIOPacket.java:199)
at
app//oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:141)
at
app//oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:114)
at
app//oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:98)
at
app//oracle.jdbc.driver.T4CMAREngineNIO.prepareForUnmarshall(T4CMAREngineNIO.java:834)
at
app//oracle.jdbc.driver.T4CMAREngineNIO.unmarshalUB1(T4CMAREngineNIO.java:487)
at app//oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:623) at
app//oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:299) at
app//oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:512) at
app//oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:163)
at
app//oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1467)
at
app//oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:4127)
at
app//oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:924)
at
app//oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchNextRows(InsensitiveScrollableResultSet.java:831)
at
app//oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:803)
at
app//oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:504)
at
app//io.vertx.oracleclient.impl.commands.QueryCommand.decodeResultSet(QueryCommand.java:216)
at
app//io.vertx.oracleclient.impl.commands.QueryCommand.decode(QueryCommand.java:165)
at
app//io.vertx.oracleclient.impl.commands.OraclePreparedQuery.lambda$doExecute$0(OraclePreparedQuery.java:77)
at
app//io.vertx.oracleclient.impl.commands.OraclePreparedQuery$$Lambda$242/0x0000000100369440.apply(Unknown
Source) at
app//io.vertx.core.impl.future.Composition.onSuccess(Composition.java:38)
at
app//io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
at
app//io.vertx.core.impl.future.FutureImpl.tryComplete(FutureImpl.java:211)
at
app//io.vertx.core.impl.future.PromiseImpl.tryComplete(PromiseImpl.java:23)
at
app//io.vertx.oracleclient.impl.Helper$1.lambda$onNext$0(Helper.java:94)
at
app//io.vertx.oracleclient.impl.Helper$1$$Lambda$259/0x0000000100391440.handle(Unknown
Source) at
app//io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:100)
at
app//io.vertx.core.impl.AbstractContext.dispatch(AbstractContext.java:63)
at
app//io.vertx.core.impl.EventLoopContext.lambda$runOnContext$0(EventLoopContext.java:38)
at
app//io.vertx.core.impl.EventLoopContext$$Lambda$121/0x000000010023fc40.run(Unknown
Source) at
app//io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java:164)
at
app//io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:469)
at app//io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:503)
at
app//io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:986)
at
app//io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at
app//io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
So far I'm using JDBC Client running by WorkerExecutor, I hoped that by using reactive client I can simplify code but now i'm discouraged. Can you suggest me please what I am doing wrong or misunderstood. Thank you.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
不幸的是,这是Vert.x Reactive Oracle客户端中的错误。
我已经提交 https://github.com/eclipse-comlec.com/eclipse-vertx/ VERTX-SQL-CLIENT/essess/1188
感谢您分享您的发现。
This is a bug in the Vert.x Reactive Oracle Client, unfortunately.
I've filed https://github.com/eclipse-vertx/vertx-sql-client/issues/1188
Thanks for sharing your findings.