2009年2月24日星期二

纠错对hibernate sessionFactory的使用

现状:
1 程序中使用username/password。硬编码。
2 待连接的数据库IP可能变化,并且不是从默认的hibernate.cfg.xml读取,而是从eclipse的preference本地存储读取。
3 获取hibernate sessionFactory的代码放在common包里。而数据库的IP配置是在btaf包里。

问题:

因为database IP可以动态改变,所以,HibernateUtil传统的静态初始化已经不能使用。同时,对preference中IP的依赖要传递到HibernateUtil中。
DBConnInfo在构造时保存从preference中获得的IP等信息,并提供方法返回DB URL。但是,当用户更改了IP后不能够构造新的sessionFactory.

解决:

1)在common包中创建HibernateUtil类。提高静态方法 public synchronized static SessionFactory getSessionFactory(String url);
这个方法根据url构建hibernate SessionFactory实例。如果传入的url不同于上个,则需要首先关闭以前创建的sessionFactory.
2) 所有获得sessionFactory的地方,都通过HibernateUtil.getSessionFactory(url)获得。不能把sessionFactory作为类变量保存。这样就保证了sessionFactory的单例。
3)在UI上更改DB IP后,要更新DBConnInfo实例。因为DBConnInfo是单例,所以获得url可以保证最新。

经验:
  • Hibernae的SessionFactory代表了对数据库的连接资源。
  • 如果你的应用中只需要用一个用户名密码对一个数据库连接,那么,一定要保证对SessionFactory实例是单例的。
  • 对sessionFactory 对象的引用生命期越短越好,最好不要出现在域变量中。
  • 如果你需要重新建立一个sessionFacotry,你需要保证对被废弃的sessionfactory object进行必要的清理工作。

**
DbConnInfo 这个类本来的目的就是保存数据库连接信息。但是,里面竟然出现了import ##.ui.preferences.PreferenceConstants;