视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
MySQL查询超时的设置方法
2020-11-09 15:49:16 责编:小采
文档

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入 这里顺带解释一下什么是non-interactive connection Non-Interactive Commands Just do a quick look up on a table without logging into the client, running the query then logging back out aga

欢迎进入Linux社区论坛,与200万技术人员互动交流 >>进入

  这里顺带解释一下什么是non-interactive connection

  > Non-Interactive Commands

  Just do a quick look up on a table without logging into the client, running the query then logging back out again.

  You can instead just type one line using the ' -e ' flag.

  [sql]

  c:\mysql\bin\mysql -u admin -p myDatabase -e 'SELECT * FROM employee'

  net_read_timeout / net_write_timeout

  The number of seconds to wait for more data from a connection before aborting the read. Before MySQL 5.1.41, this timeout applies only to TCP/IP connections, not to connections made through Unix socket files, named pipes, or shared memory. When the server is reading from the client, net_read_timeout is the timeout value controlling when to abort. When the server is writing to the client, net_write_timeout is the timeout value controlling when to abort. See also slave_net_timeout.

  On Linux, the NO_ALarm build flag affects timeout behavior as indicated in the description of the net_retry_count system variable.

  解释:这个参数只对TCP/IP链接有效,分别是数据库等待接收客户端发送网络包和发送网络包给客户端的超时时间,这是在Activity状态下的线程才有效的参数

  JDBC setQueryTimeout函数:

  为了避免查询出现死循环,或时间过长等现象,而导致线程阻塞,在获得Statement的实例后,stmt.setQueryTimeout(10); 避免因为查询导致程序出现线程阻塞。

  但昨天发现程序出现了,“ORA-01013: 用户请求取消当前的操作”的异常。手工执行出错SQL语句发现,这个语句耗时20多秒。因为setQueryTimeout(10),所以还没有执行完查询语句就抛出异常了。使用setQueryTimeout(10)时一定要把时间设置的长一些,如60秒以上。只要不导致线程长期阻塞,就可以。太短了容易抛出,“ORA-01013: 用户请求取消当前的操作”的异常

  JDBC实现setQueryTimeout的原理:

  [java]

  class IfxCancelQueryImpl extends TimerTask

  implements IfmxCancelQuery

  {

  IfxStatement stmt;

  Timer t = null;

  public void startCancel(IfxStatement paramIfxStatement, int paramInt)

  throws Exception

  {

  this.stmt = paramIfxStatement;

  this.t = new Timer(true);

  this.t.schedule(this, paramInt * 1000);

  }

  public void run()

  {

  try

  {

  this.stmt.cancel();

  this.t.cancel();

  }

  catch (SQLException localSQLException)

  {

  this.t.cancel();

  throw new Error(localSQLException.getErrorCode() + ":" + localSQLException.getMessage());

  }

  }

  }

  可见,query timeout是通过客户端解决方案来做的,服务器端无需知晓。通过一个timer线程来监控执行时间,如果执行时间超时,则会schedule run()函数。

[1] [2]

下载本文
显示全文
专题