我正在重构其他代码。我注意到的一件事是关于系统如何从连接池获取连接的方式。
样本就是这样。在每次调用服务方法时,系统都会在JNDI上针对数据源进行上下文查找。
public class CheckinServlet extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try { //Obtain Connection InitialContext initialContext = new InitialContext(); javax.sql.DataSource ds = (javax.sql.DataSource) initialContext .lookup("jdbc/mysqldb"); java.sql.Connection conn = ds.getConnection(); //business logic //redirect } finally { conn.close(); } } }
我确实认为每次这样做都会对性能产生影响。我正在考虑解决这些问题的另一种方法,即如何从连接池中检索连接。
我正在考虑使用servlet的init()方法,但我认为这不是最佳选择。
init()
一次执行一次,ServletContextListener而不是每次在init()许多servlet中执行一次。contextInitialized()在webapp启动期间,该方法仅执行一次。
ServletContextListener
contextInitialized()
public class Config implements ServletContextListener { private static final String ATTRIBUTE_NAME = "config"; private DataSource dataSource; @Override public void contextInitialized(ServletContextEvent event) { ServletContext servletContext = event.getServletContext(); String databaseName = servletContext.getInitParameter("database.name"); try { dataSource = (DataSource) new InitialContext().lookup(databaseName); } catch (NamingException e) { throw new RuntimeException("Config failed: datasource not found", e); } servletContext.setAttribute(ATTRIBUTE_NAME, this); } @Override public void contextDestroyed(ServletContextEvent event) { // NOOP. } public DataSource getDataSource() { return dataSource; } public static Config getInstance(ServletContext servletContext) { return (Config) servletContext.getAttribute(ATTRIBUTE_NAME); } }
在中进行如下配置web.xml:
web.xml
<context-param> <param-name>database.name</param-name> <param-value>jdbc/mysqldb</param-value> </context-param> <listener> <listener-class>com.example.Config</listener-class> </listener>
您可以按以下方式在servlet中获取它(init()或doXXX()选择方法):
doXXX()
DataSource dataSource = Config.getInstance(getServletContext()).getDataSource();
但是,我将进一步重构它,最好将JDBC代码放在其自己的类中,而不是在servlet中。查找DAO模式。