1

数据库连接如下

public Connection getDBConection(){  
   Context context = new InitialContext();  
   DataSource dataSource = (javax.sql.DataSource) context.lookup("java:myDataSource");  
   Connection conn = dataSource.getConnection();  
}  

对于用户A,是每个数据库请求都应该调用getDBConnection()一次;但不需要控制所有请求使用相同的连接?

也就是说,如果userA有3个数据库请求,那么userA应该调用getDBConnection()3次,Connection.closed()每次请求都用完后调用?

如果userA调用getDBConnection()了3次(也就是调用dataSource.getConnection()了3次),是不是创建了三个连接?或者它是未知的,由weblogic控制?

感觉很乱,是不是一个数据库请求就应该有一个新的连接?或者只是DataSource.getConnection()为每个数据库请求调用,创建的新连接数由 Web 服务器控制,无需考虑实际创建了多少连接。

4

1 回答 1

4

每次调用DataSource.getConnection时,数据源都会为您检索连接。返回的连接应该没有被其他任何人积极使用,但它不一定是全新的连接。

例如,如果您使用连接池,这是一种非常常见的做法,那么当您调用 时Connection.close,连接实际上并没有关闭,而是返回到可用连接池中。然后,当您调用 时DataSource.getConnection,连接池将查看它周围是否有任何尚未分发的空闲连接。如果是这样,它通常会测试它们是否过时(通常通过对虚拟表执行非常快速的查询)。如果没有,它会将现有的连接返回给调用者。但是,如果连接是陈旧的,那么连接池将从底层数据库驱动程序中检索一个真正的新连接,并返回它。

通常,连接池在任何时候都拥有最大数量的真实连接(例如 50 个)。如果您的应用程序尝试同时请求超过 50 个连接,DataSource.getConnection将抛出异常。或者在某些实现中,它会阻塞一段时间,直到一个可用,然后在该时间到期后抛出异常。有关示例实现,请查看Apache Commons DBCP

希望这能回答你的问题!

于 2013-03-01T16:43:53.963 回答