Mysql经典的“8小时问题”_Mysql

假设你的数据库是mysql,如果数据源配置不当,将可能发生经典的“8小时问题”。原因是mysql在默认情况下,如果发现一个连接的空闲时间超过8小时,将会在数据库端自动关闭这个连接。而数据源并不知道这个连接已经关闭了,当它将这个无用的连接返回给某个dao时,dao就会报无法获取connection异常。

    如果采用dbcp的默认配置,由于testOnBorrow属性的默认值是true,数据源在将连接交给dao前,会事先检测这个连接是否是好的,如果连接有问题(在数据库端被关闭),则会取一个其他的连接给dao。所以并不会有“8小时问题”。如果每次将连接交给dao时都检测连接的有效性,在高并发的应用中将会带来性能的问题,因为它会需要更多的数据库访问请求。

    一种推荐的高效的方式是:将testOnBorrow设置为false,而将“testWhileIdle”设置为true,再设置好testBetweenEvictionRunsMillis值(小于8小时)。那些被mysql关闭的连接就可以别清除出去,避免“8小时问题”。

    当然,mysql本身也能调整interactive-timeout(以秒为单位)配置参数,更改空闲连接的过期时间。所以,在设置timeBetweenEvictionRunsmMillis值时,必须首先获知mysql的空闲连接的最大过期时间。

    c3p0对于有效连接的检测,请参照dbcp配置方式。

以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-09-20 10:52:58

Mysql经典的“8小时问题”_Mysql的相关文章

mYsql日期和时间函数不求人_Mysql

对于每个类型拥有的值范围以及并且指定日期何时间值的有效格式的描述见7.3.6 日期和时间类型.  这里是一个使用日期函数的例子.下面的查询选择了所有记录,其date_col的值是在最后30天以内:  mysql> SELECT something FROM table  WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; DAYOFWEEK(date)  返回日期date的星期索引(1=星期天,2=星期一, --7=星期六).这些索引值对应于ODBC

mysql的日期和时间函数_Mysql

下面的查询选择所有 date_col 值在最后 30 天内的记录. mysql> SELECT something FROM tbl_name WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30; DAYOFWEEK(date) 返回 date 的星期索引(1 = Sunday, 2 = Monday, ... 7 = Saturday).索引值符合 ODBC 的标准. mysql> SELECT DAYOFWEEK('1998-02-03');

mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案_Mysql

解决这个问题的办法有三种: 1. 增加 MySQL 的 wait_timeout 属性的值. 修改 /etc/mysql/my.cnf文件,在 [mysqld] 节中设置: # Set a connection to wait 8hours in idle status. wait_timeout =86400 相关参数,红色部分 mysql> show variables like '%timeout%'; +--------------------------+-------+ | Vari

详解mysql的limit经典用法及优化实例_Mysql

用法一  复制代码 代码如下: SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2 OFFSET 1;  比如这个SQL ,limit后面跟的是2条数据,offset后面是从第1条开始读取. 用法二  复制代码 代码如下: SELECT `keyword_rank`.* FROM `keyword_rank` WHERE (advertiserid='59') LIMIT 2,1;  而这个S

Linux系统下自行编译安装MySQL及基础配置全过程解析_Mysql

安装依赖: CentOS: # yum -y install wget gcc-c++ cmake make bison ncurses-devel perl unzip Ubuntu:(使用ubuntu下面有不少需要root权限,请注意) 复制代码 代码如下: # sudo apt-get install -y g++ gcc make libpcre3 zlib1g libbz2-dev automake cmake perl libncurses5-dev bison 添加MySQL系统用

MySQL子查询用法实例分析_Mysql

本文实例讲述了MySQL子查询用法.分享给大家供大家参考,具体如下: 假设表my_tbl包含三个字段a,b,c:现在需要查询表中列a的每个不同值下的列b为最小值的记录量. 比如表记录为: a  b  c 1  3  'cd' 2  3  'nhd' 1  5  'bg' 2  6  'cds' 1  7  'kiy' 3  7  'vsd' 3  8  'ndf' 希望得到结果为: a  b  c 1  3  'cd' 2  3  'nhd' 3  7  'vsd' (1) 其中一个做法:先查出

关于MYSQL的优化全面详解_Mysql

先说一下最常见基本的系统瓶颈: 1.硬盘搜索.现代磁盘的平均时间通常小于10ms,因此理论上我们每秒能够大约搜索1000次,这样我们在这样一个磁盘上搜索一个数据,很难优化,一个办法就是将数据分布在多个磁盘. 2.IO读写.就磁盘来讲,一般传输10-20Mb/s,同样的,优化可以从多个磁盘并行读写. 3.CPU周期.我们将数据读入内存后,需要对它进行处理并获取我们需要的结果.表相对于内存较小时常见的限制因素.但是对于小表,速度通常不成问题. 4.内存带宽.当CPU需要的数据超出CPU缓存,主缓存带

mysql 超大数据/表管理技巧_Mysql

如果你对长篇大论没有兴趣,也可以直接看看结果,或许你对结果感兴趣.在实际应用中经过存储.优化可以做到在超过9千万数据中的查询响应速度控制在1到20毫秒.看上去是个不错的成绩,不过优化这条路没有终点,当我们的系统有超过几百人.上千人同时使用时,仍然会显的力不从心. 目录:     分区存储    优化查询    改进分区    模糊搜索    持续改进的方案 正文:     分区存储    对于超大的数据来说,分区存储是一个不错的选择,或者说这是一个必选项.对于本例来说,数据记录来源不同,首先可以

mysql创建内存表的方法_Mysql

如何创建内存表?创建内存表非常的简单,只需注明 ENGINE= MEMORY 即可: 复制代码 代码如下: CREATE TABLE  `tablename` ( `columnName` varchar(256) NOT NUL) ENGINE=MEMORY DEFAULT CHARSET=latin1 MAX_ROWS=100000000; 注意: 当内存表中的数据大于max_heap_table_size设定的容量大小时,mysql会转换超出的数据存储到磁盘上,因此这是性能就大打折扣了,所