有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java数据库查询在一段时间后挂起

我在一个Spring项目中有以下数据库配置-

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
        <property name="driverClassName" value="${db.driver}" />
        <property name="url" value="${db.jdbc.url}" />
        <property name="username" value="${db.user}" />
        <property name="password" value="${db.password}" />
        <property name="maxActive" value="75" />
        <property name="initialSize" value="10" />
        <property name="testOnBorrow" value="true" />
        <property name="validationQuery" value="SELECT 1" />
        <property name="maxWait" value="10000"></property>
    </bean>
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"
        autowire="byName">
        <property name="dataSource">
            <ref local="dataSource" />
        </property>
    </bean>

该应用程序运行一段时间(30分钟到2小时,各不相同),然后开始挂起。i、 e.浏览器一直在等待服务器响应。在检查日志时,我发现应用程序挂起在一个数据库查询上-

01/22 16:56:03 3024208 [http-bio-8080-exec-2] DEBUG DEBUG org.springframework.jdbc.core.JdbcTemplate - Executing prepared SQL statement [SELECT * FROM mytable where id = ?]

与数据库的连接是正确的,因为我能够与之交互,并从commandline或mysql workbench运行查询

问题的根源是什么?在这一点上,我完全不知道应该朝哪个方向看,因为没有抛出异常,也没有堆栈跟踪。你会用什么方法来解决这个问题


共 (1) 个答案

  1. # 1 楼答案

    您是否尝试过在应用程序挂起时创建线程转储? 如果你在linux上,你可以尝试:

    $ kill -3 <pid>
    

    线程转储被写入标准输出。它可以登录到控制台或/logs/stdout或/logs/catalina。出去