我的项目用的是MySQL数据库,部署到服务器上后,第二天就报这个错误,哪位大神有解决办法,
[2018-04-27 09:38:48] [http-bio-8080-exec-5] [ERROR] com.manage.controller.appcontrol.AppUserController :手机号登录验证异常:com.manage.exception.AtomException:
userId
,us.nickname
,us.realName
, us.sexId
, us.birthday
,us.avatar
,us.phone
FROM topuser
AS us WHERE us.userType
=0 and us.phone
=?; SQL []; No operations allowed after connection closed.; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.
[com.manage.controller.appcontrol.AppUserController] [手机号登录验证异常:com.manage.exception.AtomException:
userId
,us.nickname
,us.realName
, us.sexId
, us.birthday
,us.avatar
,us.phone
FROM topuser
AS us WHERE us.userType
=0 and us.phone
=?; SQL []; No operations allowed after connection closed.; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.]
不行就试试这个,
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${database.driver}"/>
<property name="jdbcUrl" value="${database.url}"/>
<property name="user" value="${database.username}"/>
<property name="password" value="${database.password}"/>
<property name="minPoolSize" value="1"/>
<property name="maxPoolSize" value="20"/>
<property name="maxIdleTime" value="1800"/>
<property name="acquireIncrement" value="2"/>
<property name="maxStatements" value="0"/>
<property name="initialPoolSize" value="2"/>
<property name="idleConnectionTestPeriod" value="1800"/>
<property name="acquireRetryAttempts" value="30"/>
<property name="breakAfterAcquireFailure" value="true"/>
<property name="testConnectionOnCheckout" value="false"/>
</bean>
这个字面的意思是链接关闭后不能再操作数据库了,问题具体原因还得看代码。
看楼主用的具体框架,以及对应的代码操作数据库部分是怎么写的。
无人操作 MySQL自动把链接关闭了?
TopUserMapper.xml是逆向生成的还是手动写的?手动的话认真检查有没写错某些地方,逆向的话看看TopUserMapper.getAppExternalUser()这个方法里面有没某些细节出错了,还有,看看配置文件
你吧数据库关了再重新打开啊
报错是在执行SELECT查询时发生的,所以基本可以定位到这句,然后导致MySQLNonTransientConnectionException,官方认可说法,之所以会出现这个异常,是因为Mysql在5以后针对超长时间DB连接做了一个处理,那就是如果一个DB连接在无任何操作情况下过了8个小时后,Mysql会自动把这个连接关闭。所以使用连接池的时候虽然连接对象还在但是链接数据库的时候会一直报这个异常。
MySQL推荐的解决方案:
在出现SQLException处,捕获catch,写这段重连接:
int retryCount = 5; //重连接次数,放在try...catch..finally之外
String sqlState = SQLException .getSQLState();
// 这个08S01就是这个异常的sql状态。单独处理手动重新链接就可以了。
if ("08S01".equals(sqlState) || "40001".equals(sqlState))
{
retryCount--;
} else {
retryCount = 0;
}
分析如下:
1、看看其他的功能是否可以操作。
2、如果其他的功能可以操作,检查你的脚本是否有问题,直接在mysql的客户端上执行,看是否脚本有问题
3、如果其他功能都抱数据库联接断开,请检查自己的程序进行断点跟踪一下。
这个错误的大概意思是数据连接被关闭了,无法完成连接,具体要查下你的脚本文件,主要是超时连接的断点重连的时间先后,是否与其一致。
提示上显示:连接被关闭,这个时候分两点去分析,
1.代码中是否有问题,比如:一个连接被关闭后,另外地方还在使用
2.数据库是否被关闭了,或者修改了密码导致连接失效
<environment id="env_stg">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url_stg}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<property name="poolMaximumActiveConnections" value="20"/>
<property name="poolMaximumIdleConnections" value="5"/>
<!-- MySQLNonTransientConnectionException: No operations allowed after connection closed -->
<property name="poolPingQuery" value="select 1"/>
<property name="poolPingEnabled" value="true"/>
<!-- 对于空闲的连接一个小时检查一次 -->
<property name="poolPingConnectionsNotUsedFor" value="3600000"/>
</dataSource>
</environment>
把mysql停止了,再重新启动试试