2014-11-03 2 views
-1

У меня есть база данных с двумя объектами: Магазины, Продукты. Каждый продукт получил несколько столбцов с описанием и идентификатором магазина, где вы можете получить его как FK. В магазинах также есть колонки с описанием.Эффективный способ чтения из базы данных PostgreSQL на сайте

Я хочу список магазинов TreeTable. Когда u будет развернуть дерево под каждым магазином, у вас будет список продуктов в этом магазине.

Как я сказал им, используя драйвер Vaadin TreeTable, JDBC для подключения к базе данных PostgreSQL.

Выбор магазинов (около 900 строк) является экстремальным быстро. Менее 1 с. Однако открытие заявления, выбирая все продукты в магазине и закрывая его, убивает мою БД.

Страница загружается 7-11 s даже если у меня будет 1 продукт в одном магазине. Поэтому я предполагаю, что заявление о закрытии и закрытии является основной проблемой.

EDIT: общая ситуация в том, что в одном магазине есть только 1-2 продукта. Больше не надо.

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

Мой код:

соединение Открытие:

//in db helper class 

Connection conn = null; 

void openConnection(){ 
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; 
    static final String DB_URL = "jdbc:mysql://localhost/shops"; 
    static final String USER = "username"; 
    static final String PASS = "password"; 

    try{ 
     Class.forName("com.mysql.jdbc.Driver"); 
     conn = DriverManager.getConnection(DB_URL, USER, PASS); 
    }catch(SQLException se){ 
     se.printStackTrace(); 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 

List<Shop> getAllShops(){ 
    Statement stmt = null; 
    try{ 
     stmt = conn.createStatement(); 
     ResultSet rs = stmt.executeQuery(sql); 
     while(rs.next()){ 
      //save rs into Shop object 
     } 
     rs.close(); 
    }catch(SQLException se){ 
     se.printStackTrace(); 
    }finally{ 
    try{ 
     if(stmt!=null) 
      conn.close(); 
     }catch(SQLException se){ 
    } 
    } 

//method to get operations is exacly the same but im passing Shop int id into method 

    void closeConnection(){ 
     if(connection != null) 
      conn.close(); 
    } 

    //in some layout class 
    void createAndFillTableMethod(){ 
    //create table 

     DatabaseHelper db = new DatabaseHelper(); 
     List<Shop> ls = new ArrayList<Shop>(); 
     ls = getAllShops(); 

     for(Shop shop: ls){ 
      List<Product> lp = new ArrayList<Product>(); 
      lp = getAllProducts(shop.id); 

      //add shop to table 
      //add lp list as a childs of shop to table 
     } 
     db.closeConnection(); 
} 

пс: я мог бы пропустить некоторые пытаются уловы.

+1

Хорошо, что вы попробовали? – Houari

+0

Сколько продуктов в магазине? 1000 строк в 1s для магазинов не звучат быстро. Возможно, уже возникла проблема с вашим каналом в БД или в вашей БД в целом. Ну, все зависит от данных, и это очень широкий вопрос ... – cfrick

+0

@houari code – ilovkatie

ответ

1

Проблема решена. Я нашел где-то хорошие привычки при подключении к базе данных по веб-сайту.

Что я сделал:

  1. Добавлено сессионного события в моей Vaadin Servlet.
  2. В начале сеанса: открытие соединения с базой данных PostgreSQL.
  3. При закрытии сеанса закрытие открытого соединения.

Что больше:

Для предотвращения многократного открыл соединение (обновив с помощью кнопки F5) я окружать открытое соединение с synchronized заявление и добавить флаг.

насчет заявлений и наборов результатов:

Они остаются теми же. Открытие перед каждым выбором и закрытием после выполнения и сохранения результатов.

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