Передача источника данных jdbc v / s, передача объекта Connection - из сервлета в класс java - PullRequest
2 голосов
/ 22 января 2012

У меня есть основной сервлет, который обрабатывает запросы 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);
        }

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

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

1 Ответ

3 голосов
/ 22 января 2012

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

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

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

...