首先说一下题目的意思。比如在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这一部分的代码,应该会有更好的解释吧。
分享到:
相关推荐
Spring文件中的 SessionFactory中 加入为了能得到同一个Session
两种配置:oracle mysql,切换数据库只要把SessionFactory的配置文件改成对应就可以了 c3p0配置:mysql调试通过,oracle由于存在问题,未配置 spring配置式事务管理(jdk动态代理,每个service必须对应一个接口) ...
Spring配置管理SessionFactory与数据库的连接,在实际的应用中,数据源会采用依赖注入的方式,传递给SessionFactory。 见beans-config_sh.xml 24.3 Spring对Hibernate的简化 24.3.1 概述 Hibernate的持久层访问步骤...
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 系统用例图 ...
2.初始不了SessionFactory 可能是二级缓存初始化问题,去掉二级缓存即可(在hibernate.配置文件中)(没多大用) 3. hibernate配置文件和applicationContent中也要修改数据库用户名和密码 因为这个是网站,所以源...
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 系统用例图 ...
由于Spring通过代理Hibernate完成数据层的操作,所以原Hibernate的配置文件hibernate.cfg.xml的信息也转移到Spring的配置文件中: 代码 4 Spring中有关Hibernate的配置信息 1. 2. !-- 数据源的配置 //--> 3. ...
<description>Spring公共配置文件 <!-- 启用spring注解支持 --> <!-- <bean id="sessionFactory"--> <!-- class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">--> <!-- <!-- value...
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 系统用例图 ...
到此,Struts+hibernate+spring配置完成。 附加:在项目名称的右键后进入Properties然后进入Java Build Path后查看加载的jar包。 具体项目的开发详细文档请见下一篇文章《struts+hibernate+spring项目开发示例》 ...
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...
详细示范了当前java里面流行的三大框架的整合,对于spring的配置文件applicationContext.xml做了详细的注释说明,里面包含数据库连接池、Hibernate里的SessionFactory、事务等重点模块的配置。在实际开发过程中多数...
java基于SSH框架的学生成绩管理系统源码。要求: (1) 整合Struts2、Spring和Hibernate框架... (3) 在Spring配置文件中增加该DAO层实现类的定义,并需要依赖注入一个SessionFactory bean的引用。 7、 开发Service
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配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...
一、 Spring配置hibernate3的SessionFactory 30 (一) xml形式的SessionFactory 30 (二) annotation注解方式的SessionFactory 30 二、 引入hibernate所需要使用的jar 31 (一) 基本jar 31 (二) 加入annotation功能的...
1.Hibernate工作原理及为什么要用?...1.读取并解析配置文件 2.读取并解析映射信息,创建SessionFactory 3.打开Sesssion 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session 8.关闭SesstionFactory
# 事务的织入: 开发时不必再处理SessionFactory、Session等, 只要按配置文件指定的格式对方法进行命名, 即可自动开启/提交事务; # 做了BaseDao的简单封装, 并做了基于BaseDao的增/删/改/查/分页查询等操作的示例(并...
Spring配置文件中关于事务配置总是由三个组成部分,分别是DataSource、TransactionManager和代理机制这三部分,无论哪种配置方式,一般变化的只是代理机制这部分。 DataSource、TransactionManager这两部分只是会...