2015-05-06 1575 views
1

我使用Netty和MySql构建服务器。当客户端连接到服务器时,有时(并非总是)服务器必须查询MySql才能回复。我想我可以通过以下方法之一查询MySql安全:用Netty访问MySql数据库

1)使用同步块访问MySql的代码。这对我来说是最简单的方式。不过,我担心是否阻止I/O线程(用于读/写数据到客户端的线程)

2)使用异步MySql库(例如async-mysql-connector)无需查询MySql阻塞I/O线程

3)使用Netty的内置函数访问MySql。但是,我不知道哪些功能对我的情况有用

有人可以给我一些建议吗?非常感谢

+0

为什么你需要将你的调用同步到SQL服务器?一旦遇到需要查询SQL的请求之一,您的应用程序是否需要查询产生的数据来回复任何进一步的请求? –

+0

这是一款游戏服务器。用户可能需要他们自己以及其他人的信息。许多信息如用户信息,游戏结果,上场时间等都会被记录下来并持续阅读。数据量可能非常大,只能读取一次才能存储到内存中。 – Tony

回答

1

1)即使在同步访问MySql时(即从发出单个调用后等待响应的单个线程 - 就像在JDBC中一样),您通常不需要同步块。服务器在必要时进行自我同步。如果您需要一致性,请使用交易。即使使用异步驱动程序,这应该是可能的 - 如果它支持事务。无论如何,当你使用netty的时候,你应该避免同时执行冗长的操作(包括但不限于阻止对外部服务器的调用)。这基本上是通过像servlet这样的每线程调用体系结构来消除netty(和其他异步体系结构)的所有优点。

2)I所看到的(但尚未使用)下面的异步MySQL驱动为JVM(可能有其他人):

异步MySQL的连接器(https://github.com/dgreenru/async-mysql-connector)“上实现了一个基于NIO MySQL驱动脚“,即直接在JVM nio API上不再有依赖关系。最后一次提交已经快一年了,所以它看起来看起来不太好(或者没有错误)。

postgresql-async(https://github.com/mauricio/postgresql-async)是用Scala编写的,基于netty。除了PostgreSQL之外,它还提供了一个异步MySql驱动程序。所有的例子和描述都在Scala中,但理论上它也可以用于Java。或者,你可以在Scala中实现一个小封装来实现你的功能。这在我看来是这里提到的最活跃和最完整的项目。

adbcj(https://github.com/gamlerhart/adbcj)是一个异步Java数据库驱动程序,其中包括MySql支持。该项目看起来有些放弃(最近一年多前提交)。 MySql驱动程序在其POM中依赖netty(v。4.0.6.Final - 可能适用于更新的netty 4.x版本)。

3)netty访问MySql的“内置”函数确实(afaik)不存在(而不是它的目的)。使用普通的vanilla netty意味着你必须自己实现一个异步的MySql驱动程序,这并不太容易。但是,您可以从上述项目之一开始,并根据您的需要进行定制(例如,较新的netty版本)。

结论:尝试使用其中一个异步驱动程序。如果不符合您的需求,请尝试异步执行(同步)JDBC调用,例如通过使用ThreadPoolExecutor,避免阻止netty的工作线程。