我的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);
其中spOutput
和spInput
是HashMaps。
我的配置有问题吗? TIA。
答案 0 :(得分:0)
我也有完全相同的问题。我发现问题与特定查询一致,检查了查询,发现问题在查询本身内。单独运行查询也需要时间。查询正在将列转换为较低列,并且该列未编制索引。查询就像lower(trim(column_name)),删除了lower并修剪。在那之后,它工作得非常好。
答案 1 :(得分:-1)
附加代码有帮助,但我没有看到任何会导致您看到问题的内容。你看到问题的最可能的原因是连接被拉出池,但它们没有返回,并且池最终变得饥饿。然后,dbcp池会阻止关闭,因为这些连接仍处于打开状态,可能已挂起。
要验证,您可以尝试将maxActive和类似设置设置为更低的值,甚至是“1”,然后验证您是否立即得到相同的问题。
您是否确认存储过程正在返回?即你实际上每次通话都得到spOutput
,而存储过程本身并不是一致地或随机地悬挂的?
如果是这样,我唯一的另一个建议是发布更多代码,特别是从调用堆栈导入到GetDataDao
,并包括DAO正在进行sp.execute调用的任何方法。假设您没有使用事务,但如果您是,那么显示您在代码中启动/提交事务的位置也非常重要。