2015-08-27 3 views
1

Я использую пул соединений BoneCp. У меня есть вопрос, где указать объекты соединения JDBC, чтобы он не выдавал ошибок, таких как ResultSet, закрыт или соединение закрыто.Где определить Connection, Statement, ResultSet в сервлете

Я делаю, как показано ниже: (фрагмент кода)

  public Class GetTable extends HttpServlet { 
       Connection con = null;       
       Statement stmt = null; 
       ResultSet rs = null; 
      protected void doPost(HttpServletRequest req,HttpServletResponse res) 
       { 
       con = ConnectionManager.getConnectionPool().getConnection();  
       //initializing stmt,rs 
       //close con,stmt,rs using try and catch 
       }  

      } 

Это хороший способ или я должен определить все объекты JDBC внутри doPost?

Для каждого запроса создается новый экземпляр сервлета, тогда как мне нужно управлять объектами JDBC без ошибок.

+0

Связанный/дубликат: http://stackoverflow.com/q/3106452 – BalusC

ответ

0

Нет, это не очень хорошо.

Вы используете переменные экземпляра, и те же объекты сервлета используются для обслуживания всех запросов, поступающих на этот сервлет. Итак, если приходит запрос 1, он откроет соединение и назначит его переменной экземпляра conn.

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

Все это должно быть местное переменные.

+0

Так экземпляр создается только для метода doPost, а не для всего сервлета. Я прав? –

+0

В обоих случаях будет создан экземпляр. Разница в том, что два потока не будут использовать одни и те же переменные и не будут работать на пальцах друг друга, если вы используете локальные переменные. Потому что каждый метод invocation имеет свои собственные локальные переменные, не разделяемые каким-либо другим вызовом метода. –

0

Для обслуживания соединения лучше использовать одноранговый заводский завод. А также после java 8, если u open conneciton внутри try (...), он закрывает ваше соединение после завершения блока try.

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

  • Нет связанных вопросов^_^