我是否可以使用单独的非连接池数据源进行长时间运行但不常见的任务?

时间:2012-09-06 10:27:48

标签: spring hibernate connection-pooling

我的应用程序堆栈包含在Apache tomcat 7上托管的Spring MVC,Hibernate和MySQL。

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

另一种方法是在应用程序服务器(jdbc / batchprocess)中定义新的jdbc资源,并在此资源中配置更长的超时。然后使用dynamic datasource routing从一个更改为另一个。

答案 1 :(得分:1)

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

sessionFactory.withOptions().connection( yourConnection ).openSession();