У меня в голове давно бродит идея небольшого веб-приложения, до которого уменя всё никак не доходят руки.

При этом, я не хочу делать его на PHP, как все, а использовать Java и GWT. Пугают меня большие проекты на скриптовых языках, вроде PHP и JavaScript. На мой взгляд, их трудно поддерживать и отлавливать в них ошибки. Ибо ошибка в одной части программы может вылезти боком совершенно в другом месте.

Но беда в том, что хостинг под Java/JSP/Servlet стоит денег заметно больше, по сравнению с PHP. А тут уже вступает жаба и начинает объяснять, что мне оно не особо и нужно.

Некоторое время назад я открыл для себя, что Google App Engine стал поддерживать приложения с JSP и Servlet. Ценники порадовали тем, что тестовый аккаунт можно взять вообще бесплатно, а затем платить только за реально используемое время и ресурсы. Т.е. если на сайт никто не ходит, то и платить особо ничего не нужно.

Читать далее

Hibernate — достаточно популярный пакет для упрощения работы с базой данных. Упрощение достигается путем автоматизации мапинга объектов в базу данных. Таким образом программисту не надо писать SQL запросы, а можно напрямую сохранять и загружать экземпляры классов.

Но, как обычно, в каждой бочке  мёда найдётся своя ложка дёгтя. Суть одной из проблем в том, как хранятся и представляются связи между объектами.

Задача

Есть две таблицы — People и Events. Между ними установлена связь «Многие ко многим», т.е. один человек может пойти на много событий и на одно событие пойдет много людей.

В Java, с использованием Hibernate, это будет реализовано следующим образом:

public class Man {
    private String name;
    private Vector events;
}
public class Event {
    private String name;
    private Vector people;
}

Вопросы

  1. Где проблема?
  2. Как бороться?
  3. Для всех ли случаев поможет lazy loading?

Ожидаемые ответы

  1. Проблема в том, что Hibernate будет загружать объект Man (или Event) целиком, включая все события, на которые пойдет человек. События, в свою очередь будут загружать людей, которые будут в них учавствовать. Таким образом, захотев посмотреть имя одного человека, мы имеем шанс загрузить все содержимое базы данных, с соответствующим влиянием на производительность приложения и сервера, объём памяти и загрузку каналов передачи.
  2. Правильный ответ на этот вопрос имеется в третьем вопросе и называется lazy loading. Включение этой опции позволяет загружать связи лишь при первом к ним обращении.
  3. К сожалению, даже lazy loading не решает проблему загрузки ненужных данных до конца. Например, мы хотим добавить одно новое событие к человеку и все остальные события, куда он собирается, нам безразличны. Но в момент добавления события мы обращаемся к вектору, т.е. тут же будут загружены все события. С этой бедой уже так просто не поборешься 🙁

Что проверяем

Проверяем задумывается ли человек к чему ведут его действия на более низком уровне. И как у него это получается.