[英]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操作完成为止。
您如何解决此问题实际上取决于您的应用程序要求。 例如
需要考虑的另一点是,如果数据库相对较慢,并且服务器处于负载状态,则需要在允许的连接数上设置上限,或者必须暂停Netty通道上的读取以给数据库一个追赶的机会
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.