2016-02-15 4 views
1

Я хочу сделать сервис, который сможет вернуть результат запроса sql на клиентскую сторону в трехъярусной архитектуре. С огромным размером таблицы я не могу превратить значение результата в String (ошибка пространства кучи). Поэтому я попробовал вернуть другие типы. Я надеюсь, что он может вернуться Vector<Vector<Object>> типа, который DefaultTableModel можно просто использовать, код WebService как нижекак вернуть результат SQL-запроса из webservice

public Vector<Vector<String>> ReturnSet() 
{ 
    try 
    {  
     DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver()); 
     con = DriverManager.getConnection(url, user, password); 
     SQL = "Select * from table"; 
     pst = con.prepareStatement(SQL); 
     Check = pst.executeQuery(); 
     ResultSetMetaData metaData = Check.getMetaData(); 
     int columnCount = metaData.getColumnCount(); 
     Vector<Vector<String>> Vecs = new Vector<Vector<String>>(); 
     Vector<String> cn = new Vector<String>(); 
     for (int i = 0; i < columnCount; i++) 
      cn.add(metaData.getColumnName(i+1)); 
     Vecs.add(cn); 
     while (Check.next()) 
     { 
      Vector<String> Vec = new Vector<String>(); 
      for (int i = 0; i < columnCount; i++) 
       Vec.add(Check.getString(i+1)); 
      Vecs.add(Vec); 
     } 
     return Vecs; 
    } 
    catch(SQLException e) 
    { 
     return null; 
    } 
} 

На стороне клиента, я использовал Netbeans IDE для клиента создан WebService. служба сгенерированный код, как показано ниже,

private static java.util.List<usesql.Vector> returnSet() { 
    usesql.WS_Service service = new usesql.WS_Service(); 
    usesql.WS port = service.getWSPort(); 
    return port.returnSet(); 
} 

Но каждый раз, когда звоню returnSet(), программа просто застрял, без ошибок из журнала или консоли. Мой вопрос заключается в том, чтобы заставить его работать (тип не является пределом), спасибо за любую помощь.

ответ

2

Я думаю, что проблема связана с размером данных. Если таблица огромная и содержит много данных, на самом деле нет смысла возвращать ее на запрос пользователя.

Много памяти будет потребляться на сервере. И что, если многие пользователи запрашивают данные (вызывать веб-службу) одновременно?

Кроме того, возможно, клиент будет просто перегружен таким большим количеством данных и выйдет из памяти.

База данных также работает здесь, пытаясь вернуть все данные.

Итак, я думаю, вы должны пересмотреть стратегию работы с таким большим количеством данных. Для этого есть много интересных техник.

  1. пейджинга:

    Вы действительно уверены, что клиент должен видеть все данные? Может быть, имеет смысл выставить пару кнопок (предыдущий/следующий) и по щелчку только для вызова веб-службы с некоторыми параметрами пейджинговой

  2. Динамическая модель: я мог бы быть неправильно, но от имени из класс таблицы модели, так или иначе я понял, что вы используете Swing (это не имеет большого значения, хотя это может быть веб, SWT или вообще).

    В этом случае, возможно, вам следует предоставить какой-то прослушиватель, который инициирует загрузку данных в фоновом режиме (потоки в Swing/AJAX в Интернете), когда пользователь прокручивает данные.

Надеется, что это помогает

+0

Спасибо за ответ, но у меня есть еще один вопроса здесь. Есть ли лучший способ, который быстрее, чем возвращаемый тип String? Я думаю, что это вызовет слишком много времени, если придется превращать эти данные в String. – TomN

+0

Теперь я попытался сделать 'Vector' сериализацией в' String'. например http://stackoverflow.com/questions/6610608/java-web-services-and-returning-vectorvectorobject – TomN

+1

В зависимости от типа клиентских и системных требований вы можете использовать текстовые (строковые), бинарные протоколы (Thrift, Avro, Google Protobuf) и т. Д. Бинарные протоколы более компактны (вы можете передавать меньше данных по проводке + без HTTP-ресурсов), но вам может потребоваться много работать на сервере для кодирования данных в двоичный поток. Если вы идете в двоичном виде, вы не получите веб-сервисы REST/Soap (на практике они работают через HTTP). Итог, как я уже сказал, лучше изменить поток.Передача огромного количества данных всегда плохая идея :) –

Смежные вопросы