我尝试使用Vert。x反应式Oracle客户端版本4.2.6,以避免在事件循环中阻塞线程。我决定测试一个非常长的查询:
GlobalScope.launch(vertx.dispatcher()) {
val result = hubConnPool.preparedQuery("""select * from MDM_OKATO_TT""")
.execute()
.onComplete { println("completed") }
.onFailure { it.printStackTrace() }
}
但不幸的是,我在控制台上收到了这样的警告:
[vertx-阻塞-线程检查器]WARNNIOPacket.java:199-线程[vert. x-事件循环-线程-1,5, main]已被阻塞6866毫秒,时间限制为2000毫秒//oracle.net.ns.NIOPacket.readFromSocketChannel:线程在TimeoutSocketChannel.java:416/NIOPacket.java:1410(本机方法)在//oracle.net.ns.NSProtocolNIO.doSocketRead///oracle.net.ns.NIOPacket.readFromSocketChannel(NIOPacket.java:114)在NSProtocolNIO.java:1119///oracle.net.ns.NIONSDataChannel.readDataFromSocketChannel(NIONSDataChannel.java:98)在//oracle.net.ns.NIOPacket.readHeader/sun.nio.ch.IOUtil.read(IOUtil.java:245)在//oracle.net.ns.NIOPacket.readPacketFromSocketChannel/sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:355)在应用//oracle.net.nt.TimeoutSocketChannel.read(java.base@11.0.13)在应用java.base@11.0.13(java.base@11.0.13)在应用java.base@11.0.13(java.base@11.0.13)在应用java.base@11.0.13(io.vertx.core.impl.BlockedThreadChecker)在应用io.vertx.core.VertxException(sun.nio.ch.SocketDispatcher.read)在应用sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:43)在应用sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:276)在app//oracle. jdbc. driver. T4CMAREngineering NIO. java: 834)在app//oracle. jdbc. driver. T4CMAREngineering NIO. unmarshalUB1(T4CMAREngineering NIO. java: 487))在应用程序//oracle. jdbc. driver. OracleStatement. fetchMoreRows(OracleStatement. java: 4127)在app//oracle. jdbc. driver. InsentiveScrollableResultSet. fetchMoreRows(InsentiveScrollableResultSet. java: 924)在app//oracle. jdbc. driver. InsentiveScrollableResultSet. fetchNextRows(InsentiveScrollableResultSet. java: 831)在app//oracle. jdbc. driver. InsentiveScrollableResultSet. java: 803)在app//oracle. jdbc. driver. InsentiveScrollableResultSet.下一个(InsentiveScrollableResultSet.应用程序//io. vertx. core. impll. EventLoopContext$$Lambda121美元/0x000000010023fc40. run(未知来源)在app//io. netty. util. conthis. AbstractEventExecutor. secExecute(AbstractEventExecutor. java: 164)在app//io. netty. util. conthis. SingleThreadEventExecutor. runAllTask(SingleThreadEventExecutor. java: 469)在app//io. netty. Channel. nio. NioEventLoop.运行(NioEventLoop. java: 503)在app//io. netty. util. conthis. SingleThreadEventExecutor. java: 986)在app//io. netty. util. interal. ThreadExecutorM
到目前为止,我使用的是WorkerExecutor运行的JDBC客户机,我希望通过使用反应式客户机,可以简化代码,但现在我很沮丧。你能告诉我我做错了什么或被误解了什么吗。非常感谢。
这是一个垂直的错误。不幸的是,x是一个反应式Oracle客户端。我已经提交了https://github.com/eclipse-vertx/vertx-sql-client/issues/1188
感谢分享您的发现。
问题内容: 以下示例在Node.js书中给出: 解释了while循环为何阻止执行时,作者说: 节点将永远不会执行超时回调,因为事件循环卡在了循环中,而循环在第7行开始了,因此永远不会给它处理超时事件的机会! 但是,作者没有解释为什么这是在事件循环的背景下发生的,还是在幕后真正发生了什么。 有人可以详细说明吗?为什么节点卡住?以及如何在保留控制结构的同时更改上述代码,以使事件循环不会被阻塞,并且代码
线程实例的join()方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,这样一个线程在另一个线程结束之前不会开始运行。如果对线程实例调用join(),则当前运行的线程将阻塞,直到线程实例完成执行 但是如果我有多个线程并且当我在循环内部调用join时。所有线程并行运行。但是根据连接的概念,首先连接的线程应该完成,然后只有主线程才允许连接其他线程。 } 在上面的代码中,如果第一个线程被连接
我正在使用vert。x 2.1.5版本。我试图在我的项目中使用事件循环。下面给出了示例代码 在此代码中,我的事件总线在执行事件循环之前返回值。我需要根据事件循环输出填充我的输出 如何实现
问题内容: 当用户选择在另一个线程中启动阻止进程的菜单项时,我试图在JavaFX 8应用程序中提供反馈。在我的实际应用程序中,它是文件下载,但是通过示例,我使用最少的代码创建了一个测试用例: 它的工作方式如下:当选择“开始”菜单项时,主菜单文本应立即更改为“正在运行…”,然后应附加“完成!”。经过5秒钟的模拟我的文件下载的睡眠。 实际上发生的是,即使我正在使用,在阻止过程完成 后 , 两个 文本更
问题内容: 注意:这不是有关settimeout的复制文章,此处的关键答案是浏览器设计选项。 我开始研究node.js:一个测试异步的简单示例: 一件有趣的事情是,在带有curl的lind命令和浏览器中,它的行为是不同的:在Ubuntu 12.10中,我在两个控制台中使用curl localhost:8080,它们在几乎相同的10个发送中进行响应。 但是,我打开了两个浏览器,几乎同时发出了请求,但
我不明白以下几点: 用户级线程需要非阻塞系统调用,即多线程内核。否则,整个进程将在内核中阻塞,即使进程中还有可运行的线程。 内核线程如何处理阻塞系统调用?在用户级线程中,当一个线程进行阻塞系统调用(例如读取)时,为什么其他线程不能继续工作?