JDBC连接耗时太长

时间:2016-09-09 11:57:55

标签: java spring-mvc jdbc

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

  

“DataSourceUtils:110 - 从DataSource获取JDBC连接”

我从未有耐心真正检查检索连接需要多长时间,但我等了10分钟,并且没有任何关联的迹象。

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

  

“DisposableBeanAdapter:327 - 在名为'dataSource'的bean上调用destroy方法'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是HashMaps。

我的配置有问题吗? TIA。

2 个答案:

答案 0 :(得分:0)

我也有完全相同的问题。我发现问题与特定查询一致,检查了查询,发现问题在查询本身内。单独运行查询也需要时间。查询正在将列转换为较低列,并且该列未编制索引。查询就像lower(trim(column_name)),删除了lower并修剪。在那之后,它工作得非常好。

答案 1 :(得分:-1)

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

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

您是否确认存储过程正在返回?即你实际上每次通话都得到spOutput,而存储过程本身并不是一致地或随机地悬挂的?

如果是这样,我唯一的另一个建议是发布更多代码,特别是从调用堆栈导入到GetDataDao,并包括DAO正在进行sp.execute调用的任何方法。假设您没有使用事务,但如果您是,那么显示您在代码中启动/提交事务的位置也非常重要。