【问题标题】:JDBC Connection taking too longJDBC 连接耗时过长
【发布时间】:2016-09-09 11:57:54
【问题描述】:

我的 Spring MVC JDBC 调用有问题。如果我在启动服务器后快速拨打电话,则 JDBC 连接会在一秒钟内建立并检索数据。类似地,如果其他 DAO 彼此快速连续地被调用,那么很快就会建立连接。但是,如果我尝试在几分钟后调用 DAO,则 JDBC 连接需要永远完成。它卡在了

“DataSourceUtils:110 - 从数据源获取 JDBC 连接”

我从来没有耐心真正检查检索连接需要多长时间,但我已经等了 10 分钟,但没有任何迹象表明正在建立连接。

接下来,我至少尝试重新启动服务器。但是 JDBC 甚至会阻止服务器的停止!!控制台卡在这一行:

“DisposableBeanAdapter:327 - 在名为 'dataSource' 的 bean 上调用销毁方法 'close'”

最终我重新启动了 Eclipse,它可以正常工作,直到再次出现时间间隔。

这是我对数据源的 bean 定义:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="url" />
    <property name="username" value="abc" />
    <property name="password" value="abc" />
    <property name="validationQuery" value="SELECT 1" />
    <property name="testWhileIdle" value="true" />
    <property name="maxActive" value="100" />
    <property name="minIdle" value="10" />
    <property name="initialSize" value="10" />
    <property name="maxIdle" value="20" />
    <property name="maxWait" value="1000" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

<bean id="getDataDao" class="com.project.dao.GetDataDao">
    <constructor-arg index="0" ref="jdbcTemplate" />
    <constructor-arg index="1" value="STORED_PROC_NAME"></constructor-arg>
</bean>

在我的 DAO 文件中,我扩展了 Spring 的 StoredProcedure 类,这是构造函数:

public GetDataDao(JdbcTemplate jdbcTemplate, String spName) {

        super(jdbcTemplate, spName);

        declareParameter(new SqlParameter("p_input", Types.VARCHAR));
        declareParameter(new SqlOutParameter("o_result", Types.VARCHAR));

        compile();
    }

在另一个函数中,这就是我调用 SP 的方式:

spOutput = super.execute(spInput);

其中spOutputspInput 是HashMap。

我的配置有问题吗? TIA。

【问题讨论】:

  • 不在你的配置中,我怀疑在你的代码中......不要自己建立连接并使用弹簧管理的事务。如果你不这样做,你的池最终会用完可用的连接。在您的情况下,大约 100 个请求后(除非您将 MySQL 配置为禁止这些连接)。
  • Eclipse 与此无关。我不明白为什么人们在遇到问题时会提到他们的 IDE。 Spring 每天都在我的应用程序中正确执行此操作;它在你的代码中。
  • 修改您的问题并发布您获取和使用连接的代码。
  • 我怀疑 Eclipse 是否相关。您可以通过关闭 Eclipse、在本地将 WAR 部署到 Tomcat 并启动它来证明这一点。如果行为仍然存在,则不涉及 Eclipse。
  • 正是我的观点。 Eclipse 不相关。

标签: java spring-mvc jdbc


【解决方案1】:

我也有同样的问题。我发现该问题与特定查询一致,检查了查询并发现该问题在查询本身之内。单独运行查询也需要时间。查询正在将一列转换为较低的列,并且该列未编入索引。查询就像lower(trim(column_name)),去掉了lower 和trim。在那之后它工作得很好。

【讨论】:

    【解决方案2】:

    附加代码有帮助,但我没有看到任何会导致您看到的问题的内容。您看到的问题的最可能原因是连接被从池中拉出,但它们没有被返回,并且池最终变得饥饿。 dbcp 池稍后会阻止您的关闭,因为这些连接仍处于打开状态,并且可能已挂起。

    要验证,您可以尝试将 maxActive 和类似设置设置为更低的值,甚至可能是“1”,然后验证您是否立即遇到相同的问题。

    您是否确认您的存储过程正在返回?即,您实际上每次调用都会得到spOutput,并且存储过程本身并没有始终如一地或随机地挂起?

    如果是这样,我唯一的其他建议是发布更多代码,尤其是从通向 GetDataDao 的调用堆栈中发布更多代码,并包括 DAO 中正在进行 sp.execute 调用的任何方法。假设您没有使用事务,但如果使用了,那么在代码中显示您开始/提交事务的位置也非常重要。

    【讨论】:

    • spOutput 确实返回了正确的数据。它仅在获得连接时挂起。一旦建立起来,SP 就会快速执行并检索数据。我不认为他们其余的代码是相关的。它与 JDBC 连接无关。
    • @javaGirl243 - 我没有对你投反对票,但会认为这是因为你的问题不清楚,并且没有包含足够的信息来让某人真正帮助你。同样,我的回答被否决可能是因为我没有提供简洁的答案,而被否决者认为您的问题不应该得到回答。建议发布一个新问题,但要保持简洁并显示我在回答中提到的缺失代码。 StackOverflow 对新手来说并不总是一个友好的地方,但其目的仍然是保持一定质量的问题和答案。
    • 如果您决定发布新问题,请考虑删除此问题。
    猜你喜欢
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2013-06-16
    • 2013-02-26
    相关资源
    最近更新 更多