Делайте это один раз в ServletContextListener
вместо каждого раза в init()
многих сервлетов. Метод 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
:
<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>
Вы можете получить его в своем сервлете следующим образом (вы выбираете метод init()
или doXXX()
):
DataSource dataSource = Config.getInstance(getServletContext()).getDataSource();
Однако я бы сделал рефакторинг еще на шаг, код JDBC желательно размещать в его собственных классах, а не в сервлетах. Поиск шаблона DAO.