Правильный способ вызова источника данных JNDI в Tomcat - PullRequest
6 голосов
/ 27 января 2011

Я использую веб-приложение на Java на сервере Tomcat и хотел бы знать, что является "наилучшей практикой" в плане доступа к соединению с базой данных из JNDI Tomcat?

В настоящее время это в основном то, что яя делаю каждый раз, когда мне нужно получить доступ к базе данных:

Context envContext = null;
DataSource dataSource = null;
try {
    envContext  = (Context)ctx.lookup("java:/comp/env");
    dataSource = (DataSource)envContext.lookup("jdbc/datasource");
    return dataSource.getConnection();
} catch (Exception e){
    e.printStackTrace();
    return null;
}finally {
    if(envContext != null){
        try{
           envContext.close();
        } catch (NamingException e){
            e.printStackTrace();
        }
    }
}

Однако, является ли это правильным способом поиска соединения из JNDI каждый раз, когда я хочу получить доступ к базе данных?Должен ли я вместо этого хранить ссылку на контекст или источник данных?

Ответы [ 4 ]

4 голосов
/ 16 марта 2011

new InitialContext() стоит дорого в каждом контейнере приложения, он должен быть static final и создан в блоке static {}, что делает его Singleton.Вы должны создать эту ссылку только один раз и использовать ее везде, где вам это нужно.

DataSource также должно быть static.У вас должен быть метод public static Connection getConnection(); для извлечения Connection объектов, код никогда не должен иметь дело с DataSource напрямую.Это особенно хорошо работает с PooledDataSource реализациями.

3 голосов
/ 27 января 2011

Поиски jndi по сути являются поисками по карте, поэтому их издержки минимальны.Но предпочтительно получить DataSource один раз и «кешировать» это.Так что если что-нибудь - написание метода, возвращающего DataSource, идеально, чтобы не связывать слишком много кода с внутренними компонентами J2EE и облегчить его тестирование.

2 голосов
/ 27 января 2011

Вы тоже можете сделать что-то подобное: -

...

Context initContext = new InitialContext();
DataSource dataSource = (DataSource) initContext.lookup("java:comp/env/jdbc/datasource");

...
1 голос
/ 27 января 2011

Ваш код поиска выглядит нормальноВ контексте вашей проблемы кэширование источника данных выглядит нормально, если вы не кэшируете фактический объект соединения.

Я давно не использовал этот подход.В эти дни, как минимум, я использую Spring для внедрения источника данных / инициализации JdbcTemplate

...