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

时间:2011-01-26 22:48:43

标签: java tomcat datasource 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的引用吗?

4 个答案:

答案 0 :(得分:4)

new InitialContext()在每个应用容器中都很昂贵,它应该是static final并在static {}块中创建,有效地使其成为Singleton。您只需创建一次此引用,然后在需要的地方重复使用它。

DataSource也应该是static。您应该使用public static Connection getConnection();方法来检索Connection个对象,代码永远不必直接处理DataSource。这适用于PooledDataSource实现。

答案 1 :(得分:3)

jndi查找本质上是Map查找,因此它们的开销很小。但最好是一次获取DataSource并“缓存”它。因此,如果有的话 - 写一个返回DataSource的方法是理想的,这样就不会将太多代码绑定到J2EE内部,并使代码更容易测试。

答案 2 :(得分:2)

您也可以这样做: -

...

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

...

答案 3 :(得分:1)

您的查找代码看起来不错
在您的问题上下文中,只要您没有缓存实际的连接对象,缓存数据源就好了。

我暂时没有使用过这种方法。这些天,我至少使用spring来注入数据源/初始化JdbcTemplate