0

我的应用程序堆栈由托管在 Apache tomcat 7 上的 Spring MVC、Hibernate 和 MySQL 组成。

我已经设置了 Spring 来管理事务,并且 Hibernate 会话工厂正在利用 tomcat dbcp 连接池支持的数据源来获取连接。

我的应用程序中有一个用例,其中我运行了一个长时间运行的任务,该任务是通过 Web UI 启动的(比如单击按钮)。此任务运行 10 分钟,然后我的连接池开始抛出连接关闭异常。这显然是因为连接池设置,如果连接在特定时间后没有返回池,则将其标记为已放弃并稍后删除。我可以通过修改超时设置并将其增加到足够大的值来解决这个问题。但我可能还有其他几个类似的用例,目前可能不知道这些用例会运行多长时间。

所以我在这里考虑另一种方法。

这个用例不会经常启动,所以我可以使用单独的数据源定义而不使用连接池。当然,我可以在 Spring 中设置两个不同名称的事务管理器“abc”和“xyz”,并使用@Transactional(name=”abc”) 和@Transactional(name=”xyz)”。这两种事务管理器都将使用它们各自的数据源——一种具有连接池以支持常见用例,另一种没有连接池以支持长时间运行的事务。这样我就不必担心更改超时配置。

这将是一个普遍接受的解决方案还是我应该采用超时配置方法?

4

2 回答 2

2

如果您没有其他方法来限制应用程序可以启动的连接数,那么避免使用连接池将导致问题。例如(课程的简单示例)如果您要在每次用户单击按钮时启动批处理,请确保限制他们可以执行此任务的时间。

另一种方法是在您的应用程序服务器(jdbc/batchprocess)中定义一个新的 jdbc 资源,并在该资源中配置更长的超时时间。然后使用动态数据源路由从一个更改为另一个。

于 2012-09-06T10:46:06.833 回答
1

您可以打开 Hibernate 会话,提供您自己的连接:

sessionFactory.withOptions().connection( yourConnection ).openSession();
于 2012-09-06T12:15:28.167 回答