在使用Spring进行系统开发的时候,数据库连接一般都是配置在Spring的配置文件中,并且由Spring来管理的。在利用Spring + Hibernate进行开发时也是如此。下面是一个简单的Spring + Hibernate Dao的例子:
public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User> getAll() {
return super.getHibernateTemplate().find("from User");
}
}
在上面的这个例子中,我们并没有关闭Session,但程序并没有任何问题,那是因为Spring已经帮我们关闭了。那么再看一个例子:
public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User> getAll() {
return super.getSession().createQuery("from User").list();
}
}
这个例子会不会有问题呢?的确,上面的例子中隐藏了一个问题,数据库连接并没有被关闭,在我们的印象中这件事似乎应该是Spring的。程序执行后,好像也没有什么问题,但是连续执行该语句n次(n<=最大连接数,如果没有指定最大连接数,那么默认为10次)后,系统处于等待状态,不会继续执行了,控制台上并没有输出任何信息。打开log文件,发现系统抛出java.lang.IllegalStateException: Pool not open的异常,无法打开连接。这说明系统连接池中所有的连接都在使用中。那么我们手动关闭Session后,应该就没有问题了吧!是这样吗?修改我们的例子,如下:
public class DaoReal extends HibernateDaoSupport implements Dao {
public List<User> getAll() {
Session s = super.getSession();
try {
return s.createQuery("from User").list();
} finally {
s.close();
}
}
}
执行n遍后依然停止响应。问题出在哪里呢?其实Spring的Session总是与某个线程绑定的,而这个线程往往就是承载Servlet或Jsp的那个线程,也就是说,它的生命周期scope是request的。在上面的例子中,我们利用getSession强制获得了Hibernate的Session,这个Session可能是当前事务中之前使用过的,或者可能是一个新的,并不在当前事务中,Spring只对当前事务中的Session进行关闭。
要解决这个问题,方法有很多。可以使用我们之前讲到过的getHibernateTemplate().find()。也可以设定HibernateTemplate的AllowCreate为True,并在finally中关闭Session。也可以将true作为参数传递到super.getSession(..)方法中取得Session。这里的true表示允许创建。
分享到:
相关推荐
### Spring+Hibernate下的数据库连接动态切换 #### 一、引言 在开发多租户或多数据库环境的应用系统时,往往需要实现动态切换数据库连接的功能。本文档将详细探讨如何在Spring与Hibernate框架下实现数据库连接的...
《图书管理系统spring+struts+hibernate》是一款基于Java技术栈开发的图书管理软件,其核心框架包括Spring、Struts和Hibernate。该系统利用MySQL作为数据库存储数据,提供了完整的数据库备份,确保了数据的安全性与...
5. **配置Hibernate**:在applicationContext.xml中配置Hibernate的SessionFactory,包括实体管理工厂、实体类扫描路径、数据库连接信息、方言等。还可以配置Hibernate的缓存策略。 6. **编写实体类**:根据数据库...
在Spring中,我们可以配置多个DataSource bean,每个bean对应一个数据库连接。Spring的AbstractRoutingDataSource类可以用来实现动态数据源切换,它可以根据一定的规则(如事务上下文、请求参数等)选择使用哪个数据...
- `src/main/resources`:存放配置文件的地方,比如Spring的XML配置、Hibernate的实体映射文件(hbm.xml或注解)和数据库连接配置等。 - `src/main/webapp`:Web应用的根目录,包含静态资源(如HTML、CSS、...
4. **resources**:可能包含Hibernate的配置文件和数据库连接配置。 5. **dist**:可能包含打包后的WAR文件,可以直接部署到服务器。 要运行此项目,你需要自行下载并添加缺失的lib文件夹,确保所有必要的库都已...
在数据库连接配置方面,Spring的`applicationContext.xml`或类似的配置文件中会包含数据库连接池和数据源设置。 5. **视图层**:视图通常是JSP页面,负责展示登录表单和结果。登录表单可能包含用户名和密码输入框,...
例如,struts.xml中配置Action类及其结果视图,applicationContext.xml中配置Spring Bean,而hibernate.cfg.xml则定义了数据库连接和实体类映射。 在本项目中,"说明.txt"文件可能包含了详细的步骤指导,包括如何...
Spring作为一个全面的开发框架,提供了依赖注入、AOP(面向切面编程)、事务管理等核心功能,而Hibernate则是一个优秀的对象关系映射(ORM)框架,使得Java开发者可以更加方便地操作数据库。在本案例中,我们将探讨...
在图书管理中,Spring可以用来管理Bean的生命周期,如数据库连接池、事务管理器等。同时,Spring的AOP特性可用于实现如日志记录、权限控制等跨切面关注点。 3. **Hibernate**:Hibernate是一个强大的ORM(对象关系...
4. **Hibernate配置**:配置数据库连接,定义实体类和映射文件,设置SessionFactory。 5. **整合**:通过Spring的JSF集成库(如spring-jsf),将JSF的Managed Bean与Spring的bean关联起来,实现依赖注入。 6. **编写...
6. **开发流程**:在实际开发中,用户请求首先被Struts接收,然后转发给Spring管理的业务服务,业务服务通过Hibernate与数据库交互,最后由Struts返回结果给用户。在这个过程中,Spring可以实现事务管理和异常处理,...
在本项目中,Spring可能被用来管理Struts的Action实例,以及数据库连接等资源。Spring的ApplicationContext配置文件(如applicationContext.xml)用于配置服务层(Service)和数据访问层(DAO)的bean,实现事务管理...
这通常涉及`hibernate.cfg.xml`文件,其中包含数据库连接信息、实体类扫描路径及Hibernate的其他设置。此外,还需要编写实体类,继承Hibernate的`Entity`接口,并使用`@Entity`、`@Table`等注解标注。 在Eclipse中...
ZK、Spring和Hibernate是Java开发中的三大重要框架,它们分别在用户界面、依赖注入与事务管理、持久层操作方面发挥着关键作用。将这三者进行整合,可以构建出高效、稳定且易于维护的企业级应用。以下是对这三者整合...
最后,配置Hibernate的`hibernate.cfg.xml`,包括数据库连接信息、实体类扫描路径以及SessionFactory的创建。 5. **开发流程**:通常,开发过程中会包含以下步骤: - 创建数据库表和对应的实体类。 - 使用...
【Spring】框架是SSH中的核心,它不仅提供了依赖注入(DI)和面向切面编程(AOP)的能力,还整合了其他多种功能,如事务管理、数据库连接池、缓存等。Spring的IoC容器管理着应用的组件,使得对象之间的依赖关系可以...
5. 数据库驱动的配置和数据库连接的管理。 6. 解决库文件冲突,如Spring和Hibernate的jar包冲突。 7. 整合后的项目结构和部署设置,确保项目在Tomcat等服务器上正常运行。 通过以上步骤,开发者可以搭建一个完整的...
在这个例子中,Ibatis的SqlMapConfig.xml文件将配置数据库连接和映射文件,Action类会调用Service层的方法,Service层通过Ibatis的SqlSession执行SQL。 整合这两个框架,开发者通常需要做以下工作: - 配置Struts2...
接下来,要将Hibernate的配置集成到Spring中,这通常涉及到在Spring的配置文件中引入Hibernate的配置文件,如`hibernate.cfg.xml`,其中包含了数据库连接信息、实体类映射等设置。然后,Spring可以通过`...