2013-09-15 3 views
1

Я пытаюсь найти лучшую структуру для пулов соединений, чтобы я мог получить доступ к пулу подключений из любого сервлета и установить соединение с моей базой данных. Я слежу за некоторыми учебными пособиями по настройке и настройке пула данных и пула соединений, и все они инициализируются и доступны в классах, расширяющих HttpServlet. Так это выглядит примерно так:Лучшая структура для объединения пула с Java EE

public class DatabaseConnector extends HttpServlet { 
    private static final long serialVersionUID = 1L; 

    private DataSource dataSource; 
    private Connection connection; 
    private Statement statement; 

    public void init() throws ServletException { 
     try { 
      // Get DataSource 
      Context initContext = new InitialContext(); 
      Context envContext = (Context)initContext.lookup("java:/comp/env"); 
      dataSource = (DataSource)envContext.lookup("jdbc/test"); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 
    } 

    /** 
    * @see HttpServlet#HttpServlet() 
    */ 
    public DatabaseConnector() { 
     super(); 
    } 

    /** 
    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     ResultSet resultSet = null; 
     try { 
      // Get Connection and Statement 
      connection = dataSource.getConnection(); 
      statement = connection.createStatement(); 
      String query = "SELECT * FROM STUDENT"; 
      resultSet = statement.executeQuery(query); 
      while (resultSet.next()) { 
       System.out.println(resultSet.getString(1) + resultSet.getString(2) + resultSet.getString(3)); 
      } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     }finally { 
      try { 
       if (resultSet != null) {resultSet.close();} 
       if (statement != null) {statement.close();} 
       if (connection != null) {connection.close();} 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    /** 
    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) 
    */ 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     // TODO Auto-generated method stub 
    } 

}

Он похож на меня, что это соединение бассейн только для этого сервлета, который будет только распределять соединения, когда запрос прибудете посылается это сервлеты URL. Что делать, если я хочу иметь еще один сервлет, которому необходимо получить доступ к базе данных. Я думал просто удалить методы doGet и doPost в этом сервлете и оставить init, чтобы пул соединений был инициализирован во время выполнения, а затем имел ссылку на этот сервлет, который можно было бы использовать в других сервлетах. Однако это не похоже на правильный путь для меня. Каков наилучший способ структурирования пула соединений, к которому можно получить доступ со всех сервлетов и слушателей?

Благодарим за помощь!

+0

Вы получаете соединение с DataSource (который является интерфейсом к пулу подключений). Источник данных получен из JNDI. Если вы используете один и тот же код в любом другом классе вашего webapp, то DataSource будет таким же: все классы получат соединения от того же источника данных, который зарегистрирован в JNDI. –

ответ

4

Совершенно неправильно.

Правильный способ доступа к соединению - использовать JNDI connection pool.

Сервлеты - это HTTP-прослушиватели. Они не должны иметь ничего общего с базами данных.

Правильное многоуровневое решение Java EE ограничит источники данных для уровня обслуживания. Он будет проверять соединения входы и выходы, знать об устройствах работы и транзакциях и взаимодействовать с объектами доступа к данным.

Сервлеты должны иметь дело с услугами, а не с источниками данных.

+0

Скорее всего, это не так. Зачем вам беспокоиться о неохлаждаемом источнике данных? – duffymo

+0

Не принадлежит сервлету, ИМО. – duffymo

+0

Хорошо, вы говорите о соответствующей архитектуре для этого, а не о том, как OP извлекает его в 'init()'. –

2

Логика создания соединения может быть помещена в простой класс.

public class ConnectionManager{ 
     public static Connection getConnection(){ 
     Connection connection = null; 
     try { 
      // Get DataSource 
      Context initContext = new InitialContext(); 
      Context envContext = (Context)initContext.lookup("java:/comp/env"); 
      dataSource = (DataSource)envContext.lookup("jdbc/test"); 
      connection = dataSource.getConnection(); 
     } catch (NamingException e) { 
      e.printStackTrace(); 
     } 

     if(connection == null){ 
      throw new RuntimeException("Cannot connect"); 
     } 

     return connection; 
     } 
} 
Смежные вопросы