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

时间:2013-11-27 06:37:19

标签: java mysql jdbc netty load-testing

我使用Netty作为服务器的基础和MySQL的MySQL。我使用BoneCP来汇集我的JDBC连接。

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

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

所以我想知道每个给定时期有多少连接创建(或JDBC执行)会产生阻塞I / O.如果我的服务器被阻止,我有哪些方法可以测试?

1 个答案:

答案 0 :(得分:4)

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

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

如何解决这个问题取决于您的应用程序要求。例如

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

要考虑的另一点是,如果数据库相对较慢,并且您的服务器处于负载状态,则需要在允许的连接数上加上限,否则您必须暂停读取Netty渠道为数据库提供了追赶的机会

相关问题