Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Передача источника данных jdbc против передачи объекта Connection - от сервлета к классу java

Автор вопроса: ccotОтветов: 1

У меня есть основной сервлет, который обрабатывает запросы post/get.
Я использую пул соединений (jdbc/mysql с Glassfish v3), и мой код сервлета:

public class Controller extends HttpServlet {
private DataSource datasource;
@Override
public void init() throws ServletException {
      super.init();
     try {
        //Database Connection pooling:
        InitialContext ctx = new InitialContext();
        datasource = (DataSource)ctx.lookup("jdbc/MySQLPool");
      }
      catch (Exception e) {
         e.printStackTrace();
       }
   }
private Connection getConnection() throws SQLException {
    return datasource.getConnection();
    }
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
    Connection connection=null;
    try {
            connection = datasource.getConnection();
            Object obj=  cmdFactory.getInstance().getCommand(Cmd).execute(connection);
        }

etc... и в конце сервлета в блоке finally я закрываю соединение

Итак, прямо сейчас я передаю объект "соединение" в качестве параметра в последней строке, который будет использоваться другими (не сервлетами) классами Java через нижние уровни приложения. Это неправильно? лучше передать объект источника данных (а затем в конкретных классах сделать datasource.getConnection())? или есть что-то похожее на "getServletContext().getAttr(database)", которое можно использовать в других классах Java для получения этого соединения?

jdbcconnection-poolingservletsjakarta-ee

Ответы

Ответ 1 · рейтинг 3 · JB Nizet

Источник данных позволяет получить соединение JDBC (в большинстве случаев из пула соединений). В среде сервлетов, если вы дважды запрашиваете соединение с DataSource, вы получите два разных соединения.

Таким образом, передача DataSource не имеет смысла: вы хотите, чтобы все объекты в цепочке вызовов использовали одно и то же соединение и фиксировались в конце.

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы