spring + mybatis
redis.incr(key); //redis计数加一
try{
dbOPerHere(); //数据库操作
}catch (Exception e){
//若数据库操作失败 减一
redis.decr(key);
}
想模拟网路异常 数据库连接超时异常 通过如下方式模拟数据库连接异常
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
但发现要等差不多三分钟 才会有超时异常
另外一个奇怪现象 同样的数据源配置 若换成测试服务器 超时时间为6分钟 不知何故
Caused by: java.net.ConnectException: Connection timed out
如何显式设置数据库连接超时时间(如超时时间5秒), 不管是配置数据源 还是 修改mysql服务器的变量?
使用的数据源如下
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
或修改mysql服务器变量
>show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 3600 |
| wait_timeout | 28800 |
+-----------------------------+----------+
巴扎黑2017-04-17 14:47:31
/**
* <strong>BasicDataSource does NOT support this method. </strong>
*
* <p>Set the login timeout (in seconds) for connecting to the
* database.</p>
* <p>
* Calls {@link #createDataSource()}, so has the side effect
* of initializing the connection pool.</p>
*
* @param loginTimeout The new login timeout, or zero for no timeout
* @throws UnsupportedOperationException If the DataSource implementation
* does not support the login timeout feature.
* @throws SQLException if a database access error occurs
*/
public void setLoginTimeout(int loginTimeout) throws SQLException {
// This method isn't supported by the PoolingDataSource returned by
// the createDataSource
throw new UnsupportedOperationException("Not supported by BasicDataSource");
//createDataSource().setLoginTimeout(loginTimeout);
}
* <strong>BasicDataSource does NOT support this method. </strong> *
The above is the source code of dbcp connection pool. I don’t know what exactly this LoginTimeout() does. It is for reference only and I look forward to the follow-up questions.