Spring配置文件中SessionFactory引用Hibernate配置产生问题的思考

首先说一下题目的意思。比如在Spring配置文件中,有: 

< bean  id ="sessionFactory"
        class
="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
        destroy-method
="destroy" >
        
< property  name ="dataSource" >
            
< ref  bean ="dataSource"   />
        
</ property >
        
< property  name ="mappingResources" >
            
< list >
                
< value > mapping.hbm.xml </ value >
            
</ list >
        
</ property >
        
< property  name ="hibernateProperties" >
            
< props >
                
< prop  key ="hibernate.dialect" >
                    org.hibernate.dialect.SybaseDialect
                
</ prop >
                
< prop  key ="hibernate.query.factory_class" >
                    org.hibernate.hql.classic.ClassicQueryTranslatorFactory
                
</ prop >
            
</ props >
        
</ property >
        
<!-- <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
            </property>
        
-->
    
</ bean >

注释部分可以代替掉上面所有的property属性。而本文要比较的就是代替与否的效果差别。

先介绍一下背景吧,在做一个系统的过程中,第一种使用的是直接在spring配置文件设置sessionFactory属性的方法(如上代码)。系统的基本框架是Spring MVC&Hibernate. 应用Spring配置Transaction,而数据库操作基本永Spring的HibernateTemplete进行。事实上,这样做基本没有出现什么问题。

为了尝试Hibernate配置的其他属性(因为笔者不是很清楚Spring对此是否很好的支持),从网上看到了如注释代码般,对Hibernate配置文件进行引用的方法(暂称为第二种)。无心之下的一个尝试,带来了很多麻烦。

最大的问题是采用引用第二种方法后,Spring对于Transaction的管理变得非常不稳定。经常有Transaction 发生死锁(这里死锁的意思是,程序运行过程中数据库没有任何响应,也没有异常,而且事后发现,Transaction 没有被提交。) 甚至于,这类死锁发生时,用数据库客户端(Sybase Sql Advatage)也无法访问数据库(表现为长时间停顿,然后报连接丢失)。

另外发现,如果用第二种方法,很多基本的JDBC操作,如果不写在Transaction中,将只有第一次操作结果正常的。比如,调用sp取某值。(为了简便,绕开了HibernateTemplate,直接用JDBC基本操作处理。)这种情况下,对sp的调用需要写在事务内部,不然只能取到一次值,后面返回的值会与第一次完全一样。(同事说到这可能跟Sybase也有关,具体如何,以后有机会再研究)。而如果采用第一种配置文件的写法,无论有没有写在Transaction内部,都不会有问题。

对于事务管理不稳定的原因,我想,是不是因为在第一种中,对DataSource的定义是由Spring完成的。比如:这里看到,DataSource定义成DriverManagerDataSource的实例。

< bean  id ="dataSource"
        class
="org.springframework.jdbc.datasource.DriverManagerDataSource" >
        
< property  name ="driverClassName" >
            
< value > com.sybase.jdbc2.jdbc.SybDriver </ value >
        
</ property >
        
< property  name ="url" >
            
< value > jdbc:sybase:Tds:aaa.bbb.ccc.net:4105 </ value >
        
</ property >
        
< property  name ="username" >
            
< value > user </ value >
        
</ property >
        
< property  name ="password" >
            
< value > pass </ value >
        
</ property >
    
</ bean >

 

而第二种方法中,似乎没有牵涉到DataSource的定义。(也就是说,很可能这个处理交给了Hibernate)从而使得Spring 对数据源中某些部分的处理变得异常

笔者还认为,第二种方法常用于这样一种情况:结合Spring与Hibernate开发系统,但不使用Spring 关于Hibernate的API(如HibernateTemplate的API),还是直接使用Hibernate的。后来笔者的了解也证明,也许这种情况对于开发更有好处一些。

上面所写仅作记载。如果有机会完整读一下Spring这一部分的代码,应该会有更好的解释吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值