异常如下: 11-03 16:22:21.860 catalina-exec-31 ERROR d.s.Statement - {conn-10001, stmt-20019} execute error. SELECT 'x' com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
设置如下:
<!-- 初始化连接数 -->
<property name="initialSize" value="1"/>
<!-- 最小空闲连接数 -->
<property name="minIdle" value="1"/>
<!-- 最大连接数 -->
<property name="maxActive" value="20"/>
<!-- 当连接池中连接已经用完了,等待建立一个新连接的最大毫秒数 -->
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000"/>
<!-- 间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒,10分钟 -->
<property name="timeBetweenEvictionRunsMillis" value="600000"/>
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 30分钟 1800000 -->
<property name="minEvictableIdleTimeMillis" value="1800000"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="10000"/>
<!--用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录-->
<property name="validationQuery" value="SELECT 'x'"/>
<!-- 指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.注意:
设置为true后如果要生效,validationQuery参数必须设置为非空字符串 -->
<property name="testWhileIdle" value="true"/>
<!-- 默认值是 true ,当从连接池取连接时,验证这个连接是否有效 -->
<property name="testOnBorrow" value="false"/>
<!-- 默认值是 false, 当把该连接放回到连接池的时,验证这个连接是否有效 -->
<property name="testOnReturn" value="false"/>
<!-- mysql 5.5以上打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="50"/>
<!-- 配置监控统计拦截的filters stat, -->
<property name="filters" value="slf4j"/>
<property name="proxyFilters">
<list>
<ref bean="stat-filter"/>
<ref bean="wall-filter"/>
</list>
</property>
在sql监控里面,看到执行select 'x' 只执行了几次 并没有按照设置的去检测连接。之前的版本都没有这些问题,1.0.20之前。
原提问者GitHub用户ghost
如果您在使用1.0.26版本的MyBatis时,仍然遇到了执行"select 'x'"语句时抛出异常的问题,可能是因为MyBatis的某些配置不正确或者存在其他问题。以下是一些可能的解决方法:
检查MyBatis配置
请检查您的MyBatis配置文件,确保配置正确。特别注意以下几个配置项:
datasource.driver
datasource.url
datasource.username
datasource.password
这些配置项对于数据库连接非常重要,如果不正确,可能会导致无法连接数据库或者执行SQL语句时出现异常。
检查数据库连接
请检查您的数据库连接是否正常。您可以尝试手动连接数据库,并执行"select 'x'"语句,看是否可以正常执行。如果无法正常执行,可能是因为数据库配置不正确或者数据库本身存在问题,需要进一步排查。
尝试使用其他SQL语句
如果以上方法都无法解决问题,您可以尝试使用其他SQL语句,例如"select 1"或者"select count(*) from table"等,看是否可以正常执行。如果其他SQL语句可以正常执行,但"select 'x'"语句仍然出现异常,可能是因为MyBatis的某些配置或者代码存在问题,需要进一步排查。
根据您提供的信息,您遇到的问题是在使用 1.0.26 版本时,无法成功执行 SELECT 'x'
,报告了 Communications link failure
异常。
这个问题可能由多个因素引起。以下是一些您可以尝试的解决方法:
检查网络连接:确保您的服务器可以正常连接到数据库服务器。尝试使用其他工具或客户端连接数据库以确认网络连接正常。
检查数据库配置:请确保您的数据库配置正确并与您的应用程序配置匹配。检查数据库的主机名、端口号、用户名和密码等信息是否正确。
检查数据库状态:检查数据库服务器的运行状态,确保它正在正常运行,并且没有达到最大连接数或其他限制。查看数据库服务器的日志文件以获取更多信息。
调整连接池配置:您可以尝试调整连接池的配置参数来优化连接的管理。例如,适当调整 initialSize
、maxActive
、maxIdle
、minIdle
和 maxWait
等参数,以满足您的应用程序的需求。
检查数据库驱动程序版本:确保您正在使用与数据库服务器版本兼容的数据库驱动程序。如果您使用的是较旧的驱动程序版本,尝试升级到最新版本。
检查数据库服务器配置:检查数据库服务器的配置,确保它允许来自应用程序的连接和查询。特别注意数据库防火墙、权限和限制等设置。
如果您尝试了以上解决方法仍然无法解决问题,我建议您联系数据库管理员或技术支持团队,以获取进一步的帮助和支持。
<!-- 此配置项会影响性能,只在排查的时候打开。系统运行时最好关闭。 -->
<!-- 超过时间限制是否回收 -->
<property name="removeAbandoned" value="false"/>
<!-- 超时时间;单位为秒。180秒=3分钟 -->
<property name="removeAbandonedTimeout" value="180"/>
<!-- 关闭abanded连接时输出错误日志 -->
<property name="logAbandoned" value="true"/>
是因为配置了这个超时限制回收产生的错误日志输出。
原回答者GitHub用户ghost
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。