検索

ホームページ  >  に質問  >  本文

mysql - 如何显式修改数据库连接超时时间

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    |
+-----------------------------+----------+
迷茫迷茫2874日前724

全員に返信(1)返信します

  • 巴扎黑

    巴扎黑2017-04-17 14:47:31

     /**
         * <strong>BasicDataSource はこのメソッドをサポートしていません。 </strong>
         *
         * <p>接続時のログインタイムアウトを秒単位で設定します。
         * データベース。</p>
         * <p>
         * {@link #createDataSource()} を呼び出すため、副作用があります
         * 接続プールの初期化。</p>
         *
         * @param loginTimeout 新しいログイン タイムアウト、またはタイムアウトなしの場合は 0
         * @throws UnsupportedOperationException DataSource 実装の場合
         ※ログインタイムアウト機能はサポートしていません。
         * データベースアクセスエラーが発生した場合は @throws SQLException
         */
        public void setLoginTimeout(int loginTimeout) throws SQLException {
            // このメソッドは、によって返される PoolingDataSource ではサポートされていません。
            // createDataSource
            throw new UnsupportedOperationException("BasicDataSource ではサポートされていません");
            //createDataSource().setLoginTimeout(loginTimeout);
        }
    
    * BasicDataSource はこのメソッドをサポートしていません。 </strong>  *

    以上は dbcp 接続池のソースコードであり、LoginTimeout() が具体的にどのように実行されるかは不明ですが、単に参考として提供し、その後の継続を期待しています。

    返事
    0
  • キャンセル返事