用户的每个请求都调用一个新的getConnection()?

时间:2013-03-01 15:40:54

标签: java connection weblogic datasource

数据库连接如下所示

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

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

也就是说,如果userA有三个数据库请求,那么userA应该调用getDBConnection()三次,并在每个请求中使用后调用Connection.closed()

如果userA呼叫getDBConnection()三次(即,呼叫dataSource.getConnection()三次),是否创建了三个连接?或者它是未知的并受weblogic控制?

我觉得非常混乱,对于一个数据库请求应该有一个新连接吗?或者只为每个数据库请求调用DataSource.getConnection(),并且创建的新连接数由Web服务器控制,无需考虑实际创建了多少连接。

1 个答案:

答案 0 :(得分:3)

每次拨打DataSource.getConnection时,数据源都会为您检索连接。应该是其他人没有主动使用返回的连接,但它不一定是全新的连接。

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

通常,连接池具有最多可以保留的实际连接数(例如,50)。如果您的应用程序尝试请求超过50个并发连接,DataSource.getConnection将引发异常。或者在某些实现中,它将阻塞一段时间直到一个变为可用,然后在该时间到期后抛出异常。有关示例实现,请查看Apache Commons DBCP

希望能回答你的问题!