我使用Netty作为服务器的基础和MySQL的MySQL。我使用BoneCP来汇集我的JDBC连接。
在我的服务器中,唯一的I / O操作是JDBC连接。(和用于将异常记录到文本文件的PrintWriter)
我知道每个JDBC连接都使用单线程。但是,如果我使用BoneCP来汇集我的连接,它将在某种程度上模拟异步I / O,直到所有连接都被填满。如果我错了,请纠正我。
所以我想知道每个给定时期有多少连接创建(或JDBC执行)会产生阻塞I / O.如果我的服务器被阻止,我有哪些方法可以测试?
答案 0 :(得分:4)
JDBC是一个同步API,意味着调用线程阻塞每个操作完成。鉴于操作可能需要很长时间(相对而言)才能完成,无论JDBC驱动程序是使用阻塞还是非阻塞I / O,从Netty的角度来看,它应该被视为阻塞操作。使用连接池不会改变这种情况 - 它只会减少获取与数据库的连接的开销。
假设您执行了一个select操作,并且该操作需要100毫秒才能完成,因为它返回了大量数据。如果在Netty的I / O工作线程上执行该操作,那么该线程管理的所有通道都将停止,直到JDBC操作完成。
如何解决这个问题取决于您的应用程序要求。例如
要考虑的另一点是,如果数据库相对较慢,并且您的服务器处于负载状态,则需要在允许的连接数上加上限,否则您必须暂停读取Netty渠道为数据库提供了追赶的机会