精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2003-10-15
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,上面的方法没怎么被提过,是不是它有什么问题? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2003-10-15
没什么大问题,就是必须保证
引用 在load-on-startup的Servlet中执行一下Singleton.getInstance () 否则多线程并发时可能多次初始化。 |
|
返回顶楼 | |
发表时间:2003-10-15
是不是改成这样就不怕多进程并发请求了?
public synchronized static Singleton getInstance (); { if (instance == null); { instance = new Singleton ();; } return instance; } |
|
返回顶楼 | |
发表时间:2003-10-15
这种费时的操作还是应该在启动时完成,而不应该等到处理请求时。
加上同步效率很低。 |
|
返回顶楼 | |
发表时间:2003-10-15
yehs220 写道 这种费时的操作还是应该在启动时完成,而不应该等到处理请求时。
加上同步效率很低。 是啊。那么说这样做应该没什么问题了?有这么简便的方案,为什么还要用JNDI呢?又要绑定、又要lookup多麻烦 |
|
返回顶楼 | |
发表时间:2003-10-15
用JNDI是资源的统一管理方法,例如你的很大的项目中要管理n多的各种资源,包括Hibernate,连接池,JMS,用JCA连接的legency系统等等。用JNDI统一组织起来,提供统一的访问入口点。这样便于资源的管理和访问,如果都像这样用Singleton,就很乱,不知道系统中有哪些资源,怎么管理的。另外在EJB中使用,如果你对CLASS Loader级别掌握的不是很清楚的话,会造成Singleton失效的情况。
|
|
返回顶楼 | |
发表时间:2003-10-17
dhj1:你的程序我看不懂诶,用code标签框一下,在加点必要的说明或许会好点
robbin:对SessionFactory来说,我需要通过JNDI服务来管理什么呢?访问权限还是别的什么?如果管理的内容只是把它统一放在一个名字目录树下面的话,我觉得也没有太大的意义。 |
|
返回顶楼 | |
发表时间:2003-10-17
robbin: 另外,关于单件类的调用问题,我有一个帖子Struts+SessionBean+DAO+PO的部署方案探讨,麻烦你帮我看看有没有什么问题。还有,我也在考虑单件类的职责问题,正在做的这个系统用单件类存放系统参数(preference)以及数据字典(性别、学历等),将SessionFacroty硬放进来好像是有点牵强,搞不懂,你再谈谈你的看法好不?
|
|
返回顶楼 | |
发表时间:2003-10-17
dhj1 写道 我想用EBOOK例子的办法,用FACADE模式,用一个JSP的BEAN,在JSP中调这个BEAN. 所有的初始化都放到这个BEAN中了,以后用HTTPSESSION传递这个BEAN的实例.
最好整理一下你的代码,我甚至看不清你的例子里面都有哪些类。看看这一页:如何使自己的帖子中的代码更加美观 |
|
返回顶楼 | |
发表时间: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方式效率要高一些。 |
|
返回顶楼 | |