繁体   English   中英

如何检查I / O操作是阻塞还是非阻塞?

[英]How to check if I/O operation is blocking or non-blocking?

我正在使用Netty作为我的服务器和JDBC for MySQL的基础。 我使用BoneCP来池化我的JDBC连接。

在我的服务器中,唯一的I / O操作是JDBC连接(和用于将异常记录到文本文件的PrintWriter)。

我知道每个JDBC连接都使用单个线程。 但是,如果我使用BoneCP池化我的连接,它将在某种程度上模拟异步I / O,直到所有连接都填满。 如果我错了纠正我。

所以我想知道在给定的时间内有多少个连接创建(或JDBC执行)会生成阻塞I / O。 我可以通过哪些方法测试服务器是否被阻止?

JDBC是一个同步API,这意味着调用线程会阻​​止每个操作完成。 鉴于某个操作可能需要很长时间(相对而言)才能完成,所以无论JDBC驱动程序使用阻塞I / O还是非阻塞I / O,从Netty的角度来看,都应将其视为阻塞操作。 使用连接池不会改变这一点-只会减少获得与数据库的连接的开销。

假设您执行选择操作,并且该操作需要100毫秒的时间才能完成,因为它返回了大量数据。 如果您在Netty的I / O工作线程上执行该操作,则该线程管理的所有通道将停止,直到JDBC操作完成为止。

您如何解决此问题实际上取决于您的应用程序要求。 例如

  • 测试数据库是否可以足够快地响应,以便您可以在I / O工作线程中执行Netty JDBC操作而不会影响客户端。 这可能仅适用于客户端连接很少的轻负载服务器。
  • 根据所使用的Netty版本,可以将不同的线程池和执行程序模型添加到管道中,以从I / O线程中卸载JDBC操作。
  • 如果您使用的是最新版本的Netty 3(我认为是3.6)或Netty 4,则可以将JDBC操作卸载到完全独立的线程池中,然后在JDBC操作完成时在Netty I / O线程上引发自定义事件继续处理请求。

需要考虑的另一点是,如果数据库相对较慢,并且服务器处于负载状态,则需要在允许的连接数上设置上限,或者必须暂停Netty通道上的读取以给数据库一个追赶的机会

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM