2013-02-08 2 views
0

Как говорится в названии, я хочу очень быстро извлекать изображения (хранящиеся в longblob) при перемещении jslider. У меня 360 случаев, и это работает без ошибок, но проблема заключается в задержке/задержке каждого случая/изображения при перемещении jslider. Я тестировал эту идею с изображениями, полученными с локальной машины, и работает очень быстро/чисто. Я знаю, что проблема может быть связана с подключением к Интернету, но, поверьте, у меня есть загрузка/загрузка по крайней мере 3-4 МБ/с.Прочитайте изображение из longblob MySQL очень быстро

Лишнее примечание: стола двигатель: MyISAM колонка: LONGBLOB с каждым изображением ~ 170-200 кб - .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

В чем смысл 'PreparedStatement', когда вы пишете такой код, как' String sql = ", выберите imga из теста, где deg = '" + x + "'"; '? – adarshr

+0

PreparedStatement pstm = conn.prepareStatement ("выберите imga из теста, где deg = '" + x + "'"); ResultSet rs = pstm.executeQuery(); // Теперь все в порядке? –

+1

Вы не поняли. Вся цель 'PreparedStatement' такова, что база данных может кэшировать запросы. По этой причине вы должны использовать параметризованные запросы. Например, 'выберите imga из теста, где deg =?'. Если вы непосредственно добавляете значения, это не только плохо работает, но также подвержено атакам SQL-инъекций. Пожалуйста, прочитайте «PreparedStatement's» перед тем, как использовать их. – adarshr

ответ

0

Почему вы хотите сохранить изображения в LONGBLOB так или иначе? Разве вы не можете хранить их внутри самого Jar. Если вы все еще хотите извлечь из базы данных longblob, подумайте о том, как использовать кеширование для загрузки ваших longblob из базы данных и кэшировать его в локальной системе с помощью инициализации асинхронного потока при запуске приложения Swing.

+0

Проблема, почему я не храню ее в Jar, заключается в том, что у меня много изображений, а не только 360 случаев, у меня много 360 случаев. Я использую longblob, потому что у меня есть предыдущая проблема с blob, и по какой-то причине изображение не полностью загружено (появляется с мертвыми пикселями из-за ограничения blob). Интересна ваша идея с кешированием, но представьте, что моя таблица MySQL равна 1 ГБ, представьте, что вы можете подождать 1 час для кэширования всех данных. –