我的应用程序堆栈包含在Apache tomcat 7上托管的Spring MVC,Hibernate和MySQL。
我已经设置了Spring来管理事务,而Hibernate会话工厂正在利用tomcat dbcp连接池支持的数据源来获取连接。
我的应用程序中有一个用例,我在其中运行一个长期运行的任务,该任务通过Web UI启动(比如单击按钮)。这个任务运行让我们说10分钟,然后我的连接池开始抛出连接关闭异常。这显然是因为连接池设置,如果连接在特定时间后没有返回到池,则将其标记为已放弃并稍后删除。我可以通过修改超时设置并将其增加到足够大的值来解决这个问题。但我可能还有其他几个这样的用例,目前可能还不知道这些用例会持续多长时间。
所以我在考虑另一种方法。
此用例不会经常启动,因此我可以使用单独的数据源定义而不使用连接池。当然,我可以在Spring中设置两个不同名称为“abc”和“xyz”的事务管理器,并使用@Transactional(name =“abc”)和@Transactional(name =“xyz)”。这两个事务管理器都将使用它们各自的数据源 - 一个用于连接池以支持常见用例,另一个用于没有连接池以支持长时间运行的事务。这样我就不用担心更改超时配置了。
这是一个普遍接受的解决方案还是应该采用超时配置方法?
答案 0 :(得分:2)
如果您没有其他方法来限制应用程序可以启动的连接数,则避免使用连接池会导致问题。例如(cours的简单示例)如果您每次用户单击按钮时都要启动批处理,请确保限制他们执行此任务的时间。
另一种方法是在应用程序服务器(jdbc / batchprocess)中定义新的jdbc资源,并在此资源中配置更长的超时。然后使用dynamic datasource routing从一个更改为另一个。
答案 1 :(得分:1)
您可以打开Hibernate会话,提供自己的连接:
sessionFactory.withOptions().connection( yourConnection ).openSession();