我是Spring的新手,我正在尝试使用一些表单和视图构建一个简单的应用程序。
当我通过model.addAtribute("myObject", var)
直接在模型中注入我的对象时,一切正常。这是一个例子:
我的方法addProjectForm在项目控制器中。用户必须选择经理(用户)和公司(公司):
@RequestMapping(value = "/add")
public String addProjectForm(Model model) {
List<User> users = userService.getAllUsers();
List<Company> companies = companyService.getAllCompanies();
Project project = new Project();
model.addAttribute("users", users);
model.addAttribute("companies", companies);
model.addAttribute("project", project);
return "editProject";
}
然后,所有内容都会在视图中显示为表单。我可以根据需要刷新此页面而不会出现任何错误。
到目前为止,没有什么花哨的......但是,当我尝试显示特定项目的页面时。该页面显示了项目的信息,他的经理和他的公司。控制器看起来像:
@RequestMapping(value = "/view/{id}")
public String viewProject(@PathVariable(value = "id") String id, Model model) {
Long projectId = Long.valueOf(id);
Project project = projectService.getProject(projectId);
model.addAttribute("project", project);
return "viewProject";
}
所以我调用projectService(实际上是接口)包含via:
@Autowired
ProjectService projectService;
和方法getProject
。
/**
* Created by SebUndefined on 21/07/17.
*/
@Service("projectService")
@Transactional(readOnly = true)
public class ProjectServiceImpl implements ProjectService {
@Autowired
private ProjectDAO projectDAO;
@Override
public Project getProject(Long id) {
Project project = projectDAO.getProject(id);
return project;
}
..... Other method
}
如果我是对的,那么@Transactionnal注释会照顾(在其他功能的中间)session.close(),使其在DAO HibernateProjectDAO(实际上是接口ProjectDAO)的池中再次可用
@Repository("projectDao")
public class HibernateProjectDAO implements ProjectDAO {
@Autowired
SessionFactory sessionFactory;
@Override
public Project getProject(Long id) {
return (Project)sessionFactory.getCurrentSession().get(Project.class, id);
}
... Other method
}
对于我的实体,我使用FetchType.LAZY作为多对一关联。例如,项目只能在一个公司中==&gt;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "company_id")
@JsonManagedReference
private Company company;
然后,在我的模板中,即使使用此提取选项,我也可以按需加载公司名称,如下所示:
<td th:text="${project.company.name}">undefined</td>
Thymeleaf按需自己装载它。然后在这种情况下,我在刷新后得到此错误
org.apache.tomcat.jdbc.pool.PoolExhaustedException: [http-nio-8080-exec-5] Timeout: Pool empty. Unable to fetch a connection in 3 seconds, none available[size:20; busy:20; idle:0; lastwait:3000].
仅当我加载未加载到控制器中的实体并且错误直接链接到设置spring.datasource.tomcat.max-active = XX之前允许的刷新次数时才会出现。
放10000000很容易,但它只适用于aprox 10000000请求:)。
据我所知,在模板中获取关联实体之后,看起来Thymeleaf没有关闭事务(使其在池中可用)...
有没有人以前遇到过这个问题?我将不胜感激一些帮助:)
提前致谢!