论坛首页 Java企业应用论坛

这样管理SessionFactory有什么问题(Singleton)

浏览 8043 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2003-10-15  
在Singleton里面初始化SessionFactory
public class Singleton {
    private static Singleton instance = null;
    private static SessionFactory sessionFactory;

    public static Singleton getInstance (); {
        if (instance == null); {
            instance = new Singleton ();;
        }
        return instance;
    }

    private Singleton (); {
        initSessionFactory ();;
    }

    private void initSessionFactory (); {
        Configuration conf;
        try {
            conf = new Configuration ();
                    .addClass (Foo.class);;
            sessionFactory = conf.buildSessionFactory ();;
        } catch (Exception e); {
            log.fatal(e.getMessage (););;
        }
    }

    public SessionFactory getSessionFactory (); {
        return sessionFactory;
    }
}

任何时候需要Session的话就这样:
Session session =
    Singleton.getInstance ();.getSessionFactory ();.openSession ();;

在B/S结构中,可以在load-on-startup的Servlet中执行一下Singleton.getInstance (),直接初始化

大家都说要用JNDI,上面的方法没怎么被提过,是不是它有什么问题?
   发表时间:2003-10-15  
没什么大问题,就是必须保证
引用

在load-on-startup的Servlet中执行一下Singleton.getInstance ()

否则多线程并发时可能多次初始化。
0 请登录后投票
   发表时间:2003-10-15  
是不是改成这样就不怕多进程并发请求了?
    public synchronized static Singleton getInstance (); { 
        if (instance == null); { 
            instance = new Singleton ();; 
        } 
        return instance; 
    } 
0 请登录后投票
   发表时间:2003-10-15  
这种费时的操作还是应该在启动时完成,而不应该等到处理请求时。
加上同步效率很低。
0 请登录后投票
   发表时间:2003-10-15  
yehs220 写道
这种费时的操作还是应该在启动时完成,而不应该等到处理请求时。
加上同步效率很低。

是啊。那么说这样做应该没什么问题了?有这么简便的方案,为什么还要用JNDI呢?又要绑定、又要lookup多麻烦
0 请登录后投票
   发表时间:2003-10-15  
用JNDI是资源的统一管理方法,例如你的很大的项目中要管理n多的各种资源,包括Hibernate,连接池,JMS,用JCA连接的legency系统等等。用JNDI统一组织起来,提供统一的访问入口点。这样便于资源的管理和访问,如果都像这样用Singleton,就很乱,不知道系统中有哪些资源,怎么管理的。另外在EJB中使用,如果你对CLASS Loader级别掌握的不是很清楚的话,会造成Singleton失效的情况。
0 请登录后投票
   发表时间:2003-10-17  
dhj1:你的程序我看不懂诶,用code标签框一下,在加点必要的说明或许会好点

robbin:对SessionFactory来说,我需要通过JNDI服务来管理什么呢?访问权限还是别的什么?如果管理的内容只是把它统一放在一个名字目录树下面的话,我觉得也没有太大的意义。
0 请登录后投票
   发表时间:2003-10-17  
robbin: 另外,关于单件类的调用问题,我有一个帖子Struts+SessionBean+DAO+PO的部署方案探讨,麻烦你帮我看看有没有什么问题。还有,我也在考虑单件类的职责问题,正在做的这个系统用单件类存放系统参数(preference)以及数据字典(性别、学历等),将SessionFacroty硬放进来好像是有点牵强,搞不懂,你再谈谈你的看法好不?
0 请登录后投票
   发表时间:2003-10-17  
dhj1 写道
我想用EBOOK例子的办法,用FACADE模式,用一个JSP的BEAN,在JSP中调这个BEAN. 所有的初始化都放到这个BEAN中了,以后用HTTPSESSION传递这个BEAN的实例.

最好整理一下你的代码,我甚至看不清你的例子里面都有哪些类。看看这一页:如何使自己的帖子中的代码更加美观
0 请登录后投票
   发表时间:2003-10-17  
按照我的理解,Singleton是用于那些耗时比较大,只需要进行一次初始化的操作,例如build SessionFactory,其实只需要进行一次,而且耗时比较多,所以就可以用Singleton。

系统参数什么的我觉得没有必要放在Singleton里面吧,也许你可以这样做,在外部定义一个属性文件 configure.properties,然后写一个Singleton,里面用一个Properties去读一次。这样只需要第一次调用的时候读一次硬盘文件,而不需要每次用到的时候去读。

SessionFactory也是比较适合用Singleton来生成的。在App Server环境下,使用JNDI来管理SessionFactory会更好一些:

因为JNDI绑定SessionFactory是预创建的,不像Singleton在第一次调用的时候才初始化,需要考虑初始化的线程同步问题。

另外在一个复杂的系统中要管理的各种资源很多,作为一个项目负责人我自然希望有一种统一的资源管理和查询入口,而不是分散在程序代码各处,这样管理起来非常不方便。

另外如果对Singleton管理不善,特别是在EJB环境下,会出现Singleton失效的情况。

所以在我更倾向于使用JNDI,不过Singleton方式效率要高一些。
1 请登录后投票
论坛首页 Java企业应用版

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