我在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的引用吗?
答案 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