0

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

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

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

谢谢

编辑

这是我的名为 onChange 的 ajax 代码

$.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 并且只是在浏览器中一遍又一遍地刷新,它也会失败。

通过进一步测试,当我遇到不需要数据库连接的映射时,问题不会发生,所以它可能与我的休眠池配置有关?如果我刷新需要数据库连接的页面,则问题始终出现在第 10 个请求上。这是我的休眠 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 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 次。我不确定此后如何判断请求是否命中服务器,因为我知道至少映射没有命中。

4

1 回答 1

2

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

于 2013-02-18T20:29:16.050 回答