锁定老帖子 主题:一个关于连接池很基础的讨论.
精华帖 (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的在等待,只要进去就等待。 ======================================================================== 以上这个解释个人理解认为有问题. 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-02-17
最后修改:2011-02-18
由于getDatasource是个同步方法,如果去掉 if(null==datasource){ getDatasource(); } 那么,客户端的每次调用,都会产生一个锁的竞争,这会浪费掉比较多的IO等待,问题还是比较大的。 请参考后面童鞋的回复。 |
|
返回顶楼 | |
发表时间:2011-02-17
最后修改:2011-02-17
单例模式的第二种实现。双重锁只在第一次的时候加lock,是一种优化的方案吧。
|
|
返回顶楼 | |
发表时间:2011-02-17
最后修改:2011-02-17
单例模式的第二种实现。双重锁只在第一次的时候加lock,是一种优化的方案吧。[/
|
|
返回顶楼 | |
发表时间:2011-02-17
问题说的不太好.
我的意思是datasource需要在同步方法里判断吗? |
|
返回顶楼 | |
发表时间:2011-02-17
lndalian2000 写道 问题说的不太好.
我的意思是datasource需要在同步方法里判断吗? 肯定需要。客户端调用的方法不是同步的方法。 如果放弃在datasource中判断,你很难保证datasource只被初始化一次。 |
|
返回顶楼 | |
发表时间:2011-02-17
感觉单例就能搞掂
|
|
返回顶楼 | |
发表时间:2011-02-17
cectsky 写道 感觉单例就能搞掂
单例需要同步。在哪里同步怎么同步是一个问题。 |
|
返回顶楼 | |
发表时间:2011-02-17
因为通过getDataSource().getConnectioin()也可以获得连接
|
|
返回顶楼 | |
发表时间:2011-02-17
假设刚开始datasource为null,这时候有10个线程同时访问getConnection(),同时执行到
# if (datasource == null) { # getDataSource(); # } 那么getDataSource()会被调用10次,如果getDataSource()中不加if (datasource == null),datasource 就会被初始化10次。 因此加上还是有必要的,能够避免datasource被重复初始化。 |
|
返回顶楼 | |