如何在数据访问层中引用数据库连接池?

在一个典型的WEB应用中,使用三层模式,显示层,逻辑层,数据层。逻辑层和数据层都不引用任何显示层/WEB层里

的参数,例如request, session, context等。

在数据层,如果使用传统的创建连接的方法,我总是可以用DriverManager.getConnection(数据库url)获得连接。

这些代码可以放在数据层,同WEB容器毫无关系。

但如果使用数据库连接池的话,连接池是在WEB服务器里配置的,同WEB容器有关,而且符合逻辑的办法是在WEB服务

器启动时,通过ServletContextListener创建这个连接池。

不通过参数传递的方式(WEB容器/显示->逻辑层->数据层),如何在数据访问层引用获得这个连接池呢?我现在有

两个办法:

1 我可以在数据层里使用如下代码:

InitialContext ctx = new InitialContext();
DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/MySQLDB");
conn = ds.getConnection();
但是,如果每次使用这段代码来获得连接的话,代价同样很大。

2 在ServletContextListener中创建一个连接池的singleton,数据层里引用这个singleton.

我想请教一哈,各位还有别的办法么?谢谢了。

>如果每次使用这段代码来获得连接的话,代价同样很大
将DataSource缓存起来就可以了,一般是这样做得。