[英]MySQL Query result is very slow
我正在一個小桌子上執行一個簡單的查詢
SELECT * FROM SYSTEM
系統表只有三列(Id,Name,Progress)和1300行。
我獲取數據的代碼是:
try { Class.forName("com.mysql.jdbc.Driver").newInstance(); conn = (Connection) DriverManager.getConnection( "jdbc:mysql://192.168.0.107:3306/my_database", username.getText(), password.getText()); String query = "select * from system"; stmt = (Statement) conn.createStatement(); rs = (ResultSet) stmt.executeQuery(query); while (rs.next()) { tableModel.addRow(new Object[] { rs.getInt("Number"), rs.getString("Name"), rs.getFloat("Progress") }); } } catch (Exception e) { // some other code }`
此代碼在我的JTable中顯示日期大約需要15秒,而如果我在phpmyadmin中執行查詢則需要不到一秒鍾。
這里的問題很可能是
while (rs.next()) { tableModel.addRow(...)
每次調用addRow()
意味着“將生成正在添加的行的通知”。
這個Listener
通知意味着一些開銷。 可能,每次調用間接涉及調用invalidate
GUI的狀態invalidate
,以及更多,因為該表必須在更改后重繪。 在15秒內完成1300x意味着每秒100次這樣的呼叫,這是非常合理的。 OP應該尋找一種方法來首先收集所有數據,然后僅使用所有數據更新表模型一次 。 這可能意味着必須實現自己的DefaultTableModel
或AbstractTableModel
變體。
我會使用PreparedStatment
,我會增加默認的ResultSet
fetchSize ,我會將查詢限制為三列( 注意 id
!= Number
) -
String query = "select Number, Name, Progress from system";
stmt = conn.prepareStatement(query);
rs = stmt.executeQuery();
rs.setFetchSize(250);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.