在Tomcat中调用JNDI数据源的正确方法

我在Tomcat服务器上使用Java Web应用程序,想知道在Tomcat的JNDI中访问数据库连接方面的“最佳实践”是什么? 目前,这基本上是我每次需要访问数据库时所做的事情:
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查找连接的正确方法吗?我应该保留对Context或Datasource的引用吗?     
已邀请:
jndi查找本质上是Map查找,因此它们的开销很小。但最好是一次获取DataSource并“缓存”它。因此,如果有的话 - 编写一个返回DataSource的方法是理想的,这样就不会将太多的代码绑定到J2EE内部,并使代码更容易测试。     
new InitialContext()
在每个应用容器中都很昂贵,它应该是一个
static final
并且在
static {}
块中创建,有效地使它成为
Singleton
。您只需创建一次此引用,然后在需要的地方重复使用它。
DataSource
也应该是
static
。你应该有一个
public static Connection getConnection();
方法来检索
Connection
对象,代码永远不必直接处理
DataSource
。这适用于
PooledDataSource
实现。     
你也可以这样做: -
...

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

...
    
您的查找代码看起来不错 在您的问题上下文中,只要您没有缓存实际的连接对象,缓存数据源就好了。 我有一段时间没有使用过这种方法。这些天,我至少使用spring来注入数据源/初始化JdbcTemplate     

要回复问题请先登录注册