经常刷新/ ajax调用后,spring会冻结

时间:2013-02-18 19:06:02

标签: java spring hibernate spring-mvc

我有一个似乎工作正常的spring应用程序,除了在5-6个请求之后,它停止并且无法处理任何新的传入请求。

我的页面有一个选择下拉列表,并且该下拉列表的onChange会对spring服务器进行ajax调用。在大约5或6个之后,不再接受,刷新页面会无限期地挂起。

知道可能导致这种情况的原因吗?如果您需要有关配置文件等的更多信息,请告诉我,但我希望这是一个常见的问题,我可以指向正确的方向。

由于

修改

这是我的ajax代码,名为onChange

$.ajax({
            url: "./service.go?data="+data+",
            dataType:"json",
            timeout:15000,
            cache: false,
            success: function(data){
                ...
            },
            error: function(request,cause,data){
                if (cause ==="timeout"){
                          alert("Request timed out!");
                }
                else{
                          alert("ERROR: " + data.responseText);
                }
            }

        });

但是,我不认为这是问题所在,因为即使我根本不使用ajax并且jus在浏览器中反复点击刷新,它也会失败。

通过进一步测试,当我点击不需要数据库连接的映射时,问题不会发生,所以它可能与我的hibernate池配置有关吗?如果我刷新一个需要数据库连接的页面,问题就会出现在第10个请求上。这是我的hibernate c3p0配置

driverClassName=com.sybase.jdbc3.jdbc.SybDriver
url=jdbc:    HIDDEN
username= 
password= 
# Number of Connections a pool will try to acquire upon startup
initialPoolSize=5
# Minimum number of Connections a pool will maintain at any given time
minPoolSize=1
# Maximum number of Connections a pool will maintain at any given time
maxPoolSize=20
# Connections to acquire when the pool is exhausted
acquireIncrement=5
# Seconds a Connection can remain pooled but unused before being discarded. 30 Min Check
maxIdleTime=1800
#Test all idle, pooled but unchecked-out connections, every this number of seconds
idleConnectionTestPeriod=300

并使用这些属性我定义我的池bean如下

<bean id="dsrc" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${driverClassName}" />
        <property name="jdbcUrl" value="${url}" />
        <property name="user" value="${username}" />
        <property name="password" value="${password}" />

        <property name="initialPoolSize" value="${initialPoolSize}" />
        <property name="minPoolSize" value="${minPoolSize}" />
        <property name="maxPoolSize" value="${maxPoolSize}" />
        <property name="acquireIncrement" value="${acquireIncrement}" />
        <property name="maxIdleTime" value="${maxIdleTime}" />
        <property name="idleConnectionTestPeriod" value="${idleConnectionTestPeriod}" />
    </bean>

这是我的控制器中的简单功能,直到第10次

@RequestMapping(method = RequestMethod.GET, value = "/test")
public @ResponseBody String test(){
    System.out.println("Hello");
    //List<Object> objects = objectService.getObjects(station); // calls hibernate DAO and when this is used instead of system.out, halts after 10th call.
    return "";

}

所以我知道它是由于打印输出而击中控制器,直到第10次。我不知道如何判断请求是否正在命中服务器,因为我至少知道映射没有被命中。

1 个答案:

答案 0 :(得分:2)

您的数据库连接处理可​​能有问题。他们可能不会被送回游泳池。确保关闭所有连接。