2013-02-08 140 views
0

正如標題所說,我想要在jslider移動時非常快速地檢索圖像(以longblob存儲)。我有360個案例,而且沒有錯誤,但問題在於jslider移動時每個案例/圖像的延遲/延遲。我用本地機器檢索的圖像測試了這個想法,它的工作速度非常快/很乾淨。我知道問題可以從互聯網連接,但相信我,我有至少3-4 MB/s的下載/上傳。從longblob讀取圖像MySQL非常快

以下幾點需要注意: 表引擎:MyISAM的 柱:有每幅圖像〜170〜200 kb的LONGBLOB - png格式

//calling jslider and setup 

jslider1 = new javax.swing.JSlider(); //my jslider 
jslider1.setMajorTickSpacing(10); 
jslider1.setMaximum(360); 
jslider1.setMinorTickSpacing(5); 
jslider1.setOrientation(javax.swing.JSlider.VERTICAL); 

//and my change event 

private void jslider1StateChanged(javax.swing.event.ChangeEvent evt) { 
    int x = jslider1.getValue(); 
    switch (x) { 
      case 1: 

       try { 
        String sql = "select imga from test where deg ='" + x + "'"; 
        pst = conn.prepareStatement(sql); 
        rs = pst.executeQuery(); 

        if (rs.next()) { 
         byte[] imagedata = rs.getBytes("imga"); 
         format = new ImageIcon(imagedata); 
         jLabel1.setIcon(format); //where I put my image 
        } 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       break; 

      case 2: 

        //[...] //I have 360 cases 

    } 
} // close state changed 
+3

當你編寫像'String sql ='這樣的代碼時'PreparedStatement'的意義在測試中選擇imga,其中deg ='「+ x +」'「;'? – adarshr 2013-02-08 11:56:26

+0

PreparedStatement pstm = conn.prepareStatement(「select imga from test where deg ='」+ x +「'」); ResultSet rs = pstm.executeQuery(); //現在可以嗎? – 2013-02-08 12:04:49

+1

你沒有明白我的觀點。 'PreparedStatement'的全部目的是讓數據庫可以緩存查詢。出於這個原因,你應該使用參數化查詢。例如'從測試中選擇imga,其中deg =?'。如果直接追加值,不僅性能不佳,而且容易出現SQL注入攻擊。在使用它們之前,請閱讀'PreparedStatement's。 – adarshr 2013-02-08 12:30:31

回答

0

你爲什麼想將圖像保存在一個LONGBLOB呢?你不能將它們存儲在Jar本身中。如果您仍想從數據庫longblob中檢索,請考慮在Swing應用程序啓動時使用緩存從數據庫加載longblobs,並使用Initializing Asynchronous Thread將其緩存在本地系統中。

+0

爲什麼我不把它存儲在Jar本身的問題是我有很多圖像,不只是360個案例,我有360個案例的多個。我使用的是longblob,因爲我之前有一個blob問題,並且由於某種原因,圖像沒有被完全加載(由於blob的限制,它會出現壞點)。有趣的是你的想法與緩存,但想象我有我的MySQL表等於1 GB,想象你可以等待1小時緩存所有的數據。 – 2013-02-08 12:08:17