`
dr2tr
  • 浏览: 138469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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这一部分的代码,应该会有更好的解释吧。

分享到:
评论

相关推荐

    SSH整合中 hibernate托管给Spring得到SessionFactory

    Spring文件中的 SessionFactory中 加入为了能得到同一个Session

    springMVC + Hibernate 工程模板

    两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理(jdk动态代理,每个service必须对应一个接口) ...

    第24次课-1 Spring与Hibernate的整合

    Spring配置管理SessionFactory与数据库的连接,在实际的应用中,数据源会采用依赖注入的方式,传递给SessionFactory。 见beans-config_sh.xml 24.3 Spring对Hibernate的简化 24.3.1 概述 Hibernate的持久层访问步骤...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...

    基于J2EE短信共享网站设计(Spring+Struts2+Hibernate)

    2.初始不了SessionFactory 可能是二级缓存初始化问题,去掉二级缓存即可(在hibernate.配置文件中)(没多大用) 3. hibernate配置文件和applicationContent中也要修改数据库用户名和密码 因为这个是网站,所以源...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...

    ssh(structs,spring,hibernate)框架中的上传下载

     由于Spring通过代理Hibernate完成数据层的操作,所以原Hibernate的配置文件hibernate.cfg.xml的信息也转移到Spring的配置文件中:  代码 4 Spring中有关Hibernate的配置信息 1. 2. !-- 数据源的配置 //--> 3. ...

    spring3.2+strut2+hibernate4

    &lt;description&gt;Spring公共配置文件 &lt;!-- 启用spring注解支持 --&gt; &lt;!-- &lt;bean id="sessionFactory"--&gt; &lt;!-- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"&gt;--&gt; &lt;!-- &lt;!-- value...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    12.6.16 编写Spring和Hibernate的配置文件spring-config.xml 12.6.17 编写web.xml 12.6.18 验证示例 12.7 小结 第四篇 J2EE项目案例精选 第十三章 网上调查系统 13.1 系统概述 13.2 需求分析 13.2.1 系统用例图 ...

    Myeclipse开发struts+hibernate+spring新手入门--环境配置---项目开发示例

    到此,Struts+hibernate+spring配置完成。 附加:在项目名称的右键后进入Properties然后进入Java Build Path后查看加载的jar包。 具体项目的开发详细文档请见下一篇文章《struts+hibernate+spring项目开发示例》 ...

    Spring事务配置的五种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

    spring五种事务配置demo

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

    struts2、hibernate、spring三大框架整合项目包

    详细示范了当前java里面流行的三大框架的整合,对于spring的配置文件applicationContext.xml做了详细的注释说明,里面包含数据库连接池、Hibernate里的SessionFactory、事务等重点模块的配置。在实际开发过程中多数...

    java大作业基于SSH框架的学生成绩管理系统源码.zip

    java基于SSH框架的学生成绩管理系统源码。要求: (1) 整合Struts2、Spring和Hibernate框架...​ (3) 在Spring配置文件中增加该DAO层实现类的定义,并需要依赖注入一个SessionFactory bean的引用。 7、 开发Service

    Spring整合Hibernate 详解.doc

    6.5 Spring整合Hibernate 6.6 Spring提供的DAO支持 6.5.2 管理Hibernate的SessionFactory 6.5.3 使用HibernateTemplate ...6.5.7启动web容器读取xml配置文件 6.5.8了解继承自HibernateDaoSupport类DAO

    Spring事务配置的五种方法

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

    Spring的学习笔记

    一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...

    Struts,Spring,Hibernate三大框架的面试&笔试题

    1.Hibernate工作原理及为什么要用?...1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory

    ssh框架整合step by step (springMVC + spring 5.0.4 + hibernate 5.0.12)

    # 事务的织入: 开发时不必再处理SessionFactory、Session等, 只要按配置文件指定的格式对方法进行命名, 即可自动开启/提交事务; # 做了BaseDao的简单封装, 并做了基于BaseDao的增/删/改/查/分页查询等操作的示例(并...

    Spring事务配置5种方式

    Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...

Global site tag (gtag.js) - Google Analytics