Ответ 1
Это похоже на довольно типичное приложение Spring/Hibernate, поэтому я бы рекомендовал использовать текущие лучшие практики, которые я недавно изложил в другом ответе. В частности:
- Не расширяйте классы поддержки Spring DAO или используйте HibernateTemplate. Используйте аннотацию @Repository в сочетании с сканированием компонентов и непосредственно вставлять SessionFactory в ваш DAO.
- Используйте Spring HibernateTransactionManager и определенно используйте декларативное управление транзакциями через @Transactional как ваш подход по умолчанию.
- Пусть Spring управляет этим. Он будет открывать сессии как раз во время транзакций по умолчанию, но предпочитает открыть сеанс в шаблоне просмотра, активированный Spring OpenSessionInViewFilter.
- См. № 3.
- Всегда обрабатывайте исключения, где они должны обрабатываться - другими словами, это дизайнерское решение. Однако обратите внимание, что структура транзакции Spring по умолчанию откатывается от непроверенных исключений, но не проверяется, чтобы соответствовать поведению EJB спекуляция Обязательно установите правильные правила отката (см. Предыдущую ссылку) в любом месте, где вы используете проверенные исключения.
Кроме того, используйте пул соединений, очевидно. Apache Commons DBCP - отличный выбор. "Недостаточно утечки при подключении" недостаточно. У вас должна быть нулевая утечка соединения. В зависимости от Spring для управления вашими ресурсами это поможет. Что касается любых других проблем с производительностью, не пытайтесь оптимизировать преждевременно. Подождите, пока вы не увидите, где находятся ваши проблемные области, а затем выясните, как наилучшим образом решить каждый из них по отдельности. Поскольку ваши узкие места, скорее всего, связаны с базой данных, посмотрите главу производительности ссылки Hibernate, чтобы получить представление о том, что вы против, Он охватывает важные концепции кэширования и выборки стратегий.