我试图找出连接池的最佳结构,以便可以从任何servlet访问连接池并建立与数据库的连接。我一直在遵循一些教程来设置和配置数据源和连接池,它们都在扩展HttpServlet的类中进行了初始化和访问。所以看起来像这样:
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 } }
在我看来,此连接池仅适用于该servlet,它仅在向该servlet的URL发送get请求时才会分配连接。如果我想拥有另一个需要访问数据库的servlet怎么办?我正在考虑只删除该servlet中的doGet和doPost方法,并保留init以便在运行时初始化连接池,然后对这个servlet有一个单例引用,该引用可以在其他servlet中使用。但是,这对我来说似乎不是正确的方法。构造可从所有Servlet和侦听器访问的连接池的最佳方法是什么?
谢谢你的帮助!
完全错误。
访问连接的正确方法是使用JNDI连接池。
Servlet是HTTP侦听器。他们不应该与数据库有任何关系。
适当分层的Java EE解决方案会将数据源限制在服务层。它将检入和检出连接,了解工作和事务的单位,并与数据访问对象进行交互。
Servlet应该处理服务,而不是数据源。