Wireshark之間傳送是一個很好的免費和開源(GPL)網絡分析工具,可以在這種情況下使用,效果很好。我運行了下面的測試,看看到「普通」MySQL服務器的「典型」JDBC連接可能產生多少流量。
我在我的測試服務器上的MySQL(5.5.29-0ubuntu0.12.04.2)中創建了一個名爲jdbctest
的表。
CREATE TABLE `jdbctest` (
`id` int(11) DEFAULT NULL,
`textcol` varchar(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我與表單
id textcol
------ -------
1 ABCDEF
2 ABCDEF
3 ABCDEF
...
100000 ABCDEF
在每id
值4個字節,每textcol
值6個字節的100,000行填充它,檢索所有100,000行應該某處表示1 MB的數量級上數據。
我解僱了Wireshark的,一開始跟蹤,跑它使用MySQL連接器的Java-5.1.26下面的Java代碼:
import java.sql.*;
public class mysqlTestMain {
static Connection dbConnection = null;
public static void main(String[] args) {
try {
String myConnectionString = "";
myConnectionString =
"jdbc:mysql://192.168.1.3:3306/mytestdb";
dbConnection = DriverManager.getConnection(myConnectionString, "root", "whatever");
PreparedStatement stmt = dbConnection.prepareStatement("SELECT * FROM jdbctest");
ResultSet rs = stmt.executeQuery();
int i = 0;
int j = 0;
String s = "";
while (rs.next()) {
i++;
j = rs.getInt("id");
s = rs.getString("textcol");
}
System.out.println(String.format("Finished reading %d rows.", i));
rs.close();
stmt.close();
dbConnection.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
}
}
控制檯輸出確認我在檢索到的所有100,000行。
縱觀Wireshark的跟蹤的總結,我發現:
Packets captured: 1811
Avg. packet size: 992.708 bytes
Bytes: 1797795
的方向細分爲
packets bytes
------- -----
from me to server 636 36519
from server to me 1175 1761276
所以似乎找回我的〜1 MB我收到1.72數據來自MySQL服務器的總網絡流量的MB。下載(〜76%,包括兩個方向的流量)〜72%的開銷肯定遠不及你的(rate * time)計算所提出的約5900%開銷。
我強烈懷疑MySQL Workbench報告的〜1 MB/s速率並非整個時間內的整體平均傳輸速率。在特定情況下確定開銷的最佳方法是使用Wireshark等工具並自行測量。
你基於時間的假設是沒有根據的。數據傳輸速率不是消耗時間的唯一原因。不要讓MBs在幾秒鐘內完成。 –