您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

从连接池获取数据库连接

从连接池获取数据库连接

一次执行一次,ServletContextListener而不是每次在init()许多servlet中执行一次。contextInitialized()在webapp启动期间,该方法仅执行一次。

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>

您可以按以下方式在servlet中获取它(init()doXXX()选择方法):

DataSource dataSource = Config.getInstance(getServletContext()).getDataSource();

但是,我将进一步重构它,最好将JDBC代码放在其自己的类中,而不是在servlet中。查找DAO模式。

其他 2022/1/1 18:18:37 有480人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶