论坛首页 Java企业应用论坛

一个关于连接池很基础的讨论.

浏览 12126 次
精华帖 (1) :: 良好帖 (0) :: 新手帖 (19) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-02-17  
个人理解.配置连接池.

连接数是指Datasource里的Connection的数量.

今天跟人讨论.

看到如下代码.
public static Connection getConnection() throws DBAccessException {							
	if (datasource == null) { 					
		getDataSource();					
	}						
	Connection conn = null;						
	try {						
		conn = datasource.getConnection();					
		if (conn == null) { 					
		throw new DBAccessException("Cannot get Connection.");					
		} 					
	} catch (SQLException ex) { 						
		throw new DBAccessException("Cannot get Connection.", ex);					
	} 						
	return conn; 						
}  

private static synchronized DataSource getDataSource()	throws DBAccessException { 							
	try {  							
		if (datasource == null) { 						
			Context ctx = new InitialContext();					
			datasource = (DataSource) ctx.lookup(JNDI_NAME);					
		}						
	} catch (NamingException ex) {							
		throw new DBAccessException("Cannot get DataSource", ex);						
	}							
	return datasource;							
								
}


if (datasource == null) {

这个判断与下面的是重复的.

大家看看是否有必要这么写.

理由何在.

本人水平太低.理解不透彻.

====================先不要看下面的说明=========================
正常情况下,如果多用户同时访问一个方法,这几个用户是并行的,可以同时访问。
但如果这个方法加上了synchronized,
那么这几个用户就不能并行访问该方法,他们会变成顺序的。第一个用户访问完这个方法后,第二个用户才能访问该方法,以此类推。
※所以一个方法,加不加synchronized,在多用户访问的情况下,两者的运行效率差距很大,加synchronized的很慢。

如果不加这个if判断,10个请求都走到这里的时候,就都要执行它,因为请求是并行的,就是说可以同时执行,
但因为这个方法是synchronized的,所以他不会允许在这里并行的,要求同步,进去是串行的。
所以9个会在这里等待,一个一个通过该方法。
因为静态的变量在内存中是同一块,谁都可以改,(定义为final static的才是固定死的)
因为同一块,所以只要有一个给赋值了,
如果是加if的,那至少剩下的8个会跳过这个if同时向下执行,只有在第一个还没有给赋值的时候,立刻也进入这个if的在等待,只要进去就等待。
========================================================================
以上这个解释个人理解认为有问题.
   发表时间:2011-02-17   最后修改:2011-02-18

由于getDatasource是个同步方法,如果去掉
 if(null==datasource){
    getDatasource();
 }

那么,客户端的每次调用,都会产生一个锁的竞争,这会浪费掉比较多的IO等待,问题还是比较大的。
请参考后面童鞋的回复。
0 请登录后投票
   发表时间:2011-02-17   最后修改:2011-02-17
单例模式的第二种实现。双重锁只在第一次的时候加lock,是一种优化的方案吧。
0 请登录后投票
   发表时间:2011-02-17   最后修改:2011-02-17
单例模式的第二种实现。双重锁只在第一次的时候加lock,是一种优化的方案吧。[/
0 请登录后投票
   发表时间:2011-02-17  
问题说的不太好.

我的意思是datasource需要在同步方法里判断吗?
0 请登录后投票
   发表时间:2011-02-17  
lndalian2000 写道
问题说的不太好.

我的意思是datasource需要在同步方法里判断吗?


肯定需要。客户端调用的方法不是同步的方法。
如果放弃在datasource中判断,你很难保证datasource只被初始化一次。
0 请登录后投票
   发表时间:2011-02-17  
感觉单例就能搞掂
0 请登录后投票
   发表时间:2011-02-17  
cectsky 写道
感觉单例就能搞掂


单例需要同步。在哪里同步怎么同步是一个问题。
0 请登录后投票
   发表时间:2011-02-17  
因为通过getDataSource().getConnectioin()也可以获得连接
0 请登录后投票
   发表时间:2011-02-17  
假设刚开始datasource为null,这时候有10个线程同时访问getConnection(),同时执行到
# if (datasource == null) {                    
#         getDataSource();                     
#     }

那么getDataSource()会被调用10次,如果getDataSource()中不加if (datasource == null),datasource 就会被初始化10次。
因此加上还是有必要的,能够避免datasource被重复初始化。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics