我正在使用Netty和MySql构建一个服务器。当客户端连接到服务器时,有时(并非总是)服务器必须查询MySql才能响应。我想我可以通过以下方法之一来查询MySql安全性:
1)对访问MySql的代码使用同步块。对我来说,这是最简单的方法。然而,我担心阻塞i/o线程(用于向客户端读/写数据的线程)是否是一个好主意。
2)使用异步连接器库(如async- MySql - MySql )查询MySql,而不阻塞i/o线程。
3)使用Netty的内置函数访问MySql。但是,我不知道哪些函数对我的情况有用
有人能给我一些建议吗?非常感谢
发布于 2015-05-11 22:56:56
1)即使在同步访问MySql时(即从发出单个调用后等待响应的单个线程),通常也不需要synchronized块。服务器在必要时进行自我同步。如果您需要一致性,请使用事务。即使使用异步驱动程序,这也应该是可能的-如果它支持事务。在任何情况下,当您使用netty时,都应该避免同步执行冗长的操作(包括但不限于阻塞对外部服务器的调用)。这基本上扼杀了netty (和其他异步体系结构)相对于servlet等按线程调用的体系结构的所有优势。
2)我已经看到(但尚未使用)以下用于JVM的异步MySql驱动程序(可能还有其他驱动程序):
async- MySql -connector (https://github.com/dgreenru/async-mysql-connector)实现了一个基于nio的MySql驱动程序“徒步”,即不再依赖于JVM nio API。最后一次提交快一年了,所以它看起来维护得不是很好(或者说它没有bug)。
postgresql-async (https://github.com/mauricio/postgresql-async)是用Scala编写的,基于netty。除了PostgreSQL之外,它还提供了一个异步MySql驱动程序。所有的示例和描述都是用Scala编写的,但理论上它也可以在Java中使用。或者,您可以在Scala中为您的功能实现一个小包装器。在我看来,这是这里提到的最活跃和最完整的项目。
adbcj (https://github.com/gamlerhart/adbcj)是一个支持MySql的异步Java数据库驱动程序。这个项目看起来有点被放弃了(上一次提交是在一年多之前)。MySql驱动程序在其POM中依赖于netty (v.4.0.6最终版本-可能与较新的netty 4.x版本一起工作)。
3) netty访问MySql的“内置”函数(afaik)不存在(也不是它的目的)。使用普通的网络意味着你必须自己实现一个异步的MySql驱动程序,这并不容易。然而,你可以从上面提到的一个项目开始,并根据你的需求进行定制(例如更新的netty版本)。
结论:尝试使用其中一个异步驱动程序。如果都不能满足您的需求,请尝试异步执行(同步) JDBC调用,例如使用ThreadPoolExecutor,这样可以避免阻塞netty的工作线程。
https://stackoverflow.com/questions/30078262
复制相似问题