2015-05-06 83 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的工作線程。