在哪里初始化连接池,java tomcat

时间:2012-10-07 10:46:27

标签: java mysql tomcat connection-pooling

我已阅读此页:http://www.javaranch.com/journal/200601/JDBCConnectionPooling.html

方法范围连接的方法对我来说似乎很好。 但我有一个问题,我何时启动JDBCServlet类? 每次我想要连接?因为我认为每次我想要一个连接我只需要拨打getConnection() ...

public class JDBCServlet extends HttpServlet {

  private DataSource datasource;

  public void init(ServletConfig config) throws ServletException {
    try {
      // Look up the JNDI data source only once at init time
      Context envCtx = (Context) new InitialContext().lookup("java:comp/env");
      datasource = (DataSource) envCtx.lookup("jdbc/MyDataSource");
    }
    catch (NamingException e) {
      e.printStackTrace();
    }
  }

  private Connection getConnection() throws SQLException {
    return datasource.getConnection();
  }

  public void doGet (HttpServletRequest req, HttpServletResponse res) throws ServletException {
    Connection connection=null;
    try {
      connection = getConnection();
      ..<do JDBC work>..
    } 
    catch (SQLException sqlException) {
      sqlException.printStackTrace();
    }
    finally {
      if (connection != null) 
        try {connection.close();} catch (SQLException e) {}
      }
    }
  }
}

3 个答案:

答案 0 :(得分:2)

当您导航到servlet映射到的链接时,将调用JDBCServlet servlet。

除了在web.xml中完成从URL到servlet的映射之外,你不必做任何事情。

Web容器然后使用init方法创建servlet的实例,然后调用doGet。

这是一个带有tomcat的servlet教程的PDF,但基础是相同的。

http://www.tutorialspoint.com/servlets/servlets_tutorial.pdf

查看servlet部署部分

对于DBUtil类,这是一个很好的例子。

public class DBUtil {

private static DataSource dataSource;

static {
    try {
        dataSource = new InitialContext().lookup("jdbc/MyDataSource");
    } catch (NamingException e) { 
        throw new ExceptionInInitializerError("'jdbc/MyDataSource' not found in JNDI", e);
    }
}

public static Connection getConnection() {
    return dataSource.getConnection();
}

}

这使您的类可以被Web应用程序中的所有servlet使用。

你将通过

调用DBUtil类
try {
    connection = DBUtil.getConnection();
    statement = connection.prepareStatement("SELECT id, foo, bar FROM table");
    resultSet = statement.executeQuery();

   //Do what you need to do. 

} finally {
    if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {}
    if (statement != null) try { statement.close(); } catch (SQLException ignore) {}
    if (connection != null) try { connection.close(); } catch (SQLException ignore) {}
}

答案 1 :(得分:1)

Servlet由Container初始化,它将根据需要调用init并由web.xml配置文件定义。

使用以标准方式执行相同操作的Apache Tomcat JDBC Connection pools

答案 2 :(得分:0)

有许多连接池库,包括MySQL自己的库。很多人使用非常成熟的C3P0。

常见的想法是在服务器容器中定义数据源并从代码中访问JNDI引用。在servlet init期间,您只是查找数据源,因此这是执行此操作的理想位置。在您实际执行操作之前,这不会使用任何连接。

请参阅Tomcat DBCP了解一个好的介绍,如果您想使用C3P0 C3P0 Tomcat Configuration