美文网首页
服务武器数据库修改8小时断连问题

服务武器数据库修改8小时断连问题

作者: 北方_f6b4 | 来源:发表于2018-12-07 15:51 被阅读0次

最近在项目中遇到的问题.项目上线以后,经常会出现8小时后,页面的信息就返回不过来了.项目就死了.突然想起来了mysql数据库8小时无操作自动断连,造成假死的状况.

1 问题描述:使用了jdbc连接池,项目上线后基本上过了一夜后,数据库里面的值就返回不了了.

             程序假死

2 原因分析: 1 MySQL服务器默认的“wait_timeout”是28800秒即8小时,意味着如果一个连接   

                 的 空闲时间超过8个小时,MySQL将自动断开该连接.

                 2 我创建的连接池却认为该连接还是有 效的(因为并未校验连接的有效性,只是申请了

                   200个链接放到了ArrayBlockingQueue 里面),当超过八小时应用申请使用该连接

                        时,就会导致上面的报错。

                 3查看数据库的timeout配置

3解决方法  1直接修改数据库的默认断连时间,将其改为30天.

                            方法:直接在上面的基础上,用命令行修改(服务器数据库记得要用root 登录)

                                   1 set global wait_timeout=259100;

                                       2set global interactive_timeout=259100; 

                                    修改之后的结果用  show global variables like '%timeout%';查询

                       这种方法虽然直接解决了问题 (简单快速)

                         但是这样的话会引起很多问题,如果其数据库连接一直连接不是放的话,timeout就

                       不能起到最后一层的保护作用.很可能造成数据库连接过多导致数据库崩溃.

   2 在获取数据库连接时直接使用命令,屏蔽8小时连接断开的机制.

              String url ="jdbc:mysql://60.205.0.237:3306/test?useUnicode=true&characterEncoding=utf-8&autoReconnect=true";

    这样也能解决问题,这是在申请数据库连接时就屏蔽了这个timeout .其他申请数据库连接时自动断连机制收到影响.

    3  完善数据库连接池,让其拥有检测连接是否关闭的功能

              检测可用性代码:

                           private boolean testConnection(Connection conn) {

                                            try {

                                              // 判定测试表是否存在

                                                 if (testTable.equals("")) {

                                               // 假如测试表为空,试着使用此连接的 setAutoCommit() 方法

                                                      // 来判定连接否可用(此方法只在部分数据库可用,假如不可用,

                                           // 抛出异常)。注重:使用测试表的方法更可靠

                                         conn.setAutoCommit(true);

                          }else {// 有测试表的时候使用测试表测试

                 //check if this connection is valid

                        Statement stmt =conn.createStatement();

                        stmt.execute("select count(*) from " +testTable);

                             }

                     }catch (SQLException e) {

                         // 上面抛出异常,此连接己不可用,关闭它,并返回false;

                      closeConnection(conn);

                 return false;

                      }

                 // 连接可用,返回true

                    return true;

             }

      如此,去检测连接可用,若是不可用则删除连接,重新新建一个连接.

相关文章

  • 服务武器数据库修改8小时断连问题

    最近在项目中遇到的问题.项目上线以后,经常会出现8小时后,页面的信息就返回不过来了.项目就死了.突然想起来了mys...

  • SQL实战项目全过程

    声明:创建数据库和表时候,[]加不加效果一样,只是代码规范问题 一、数据库服务环境 (一)修改数据库服务登录用户密...

  • jhipster liquibase从数据库生成changlog

    1.修改liquibase数据库连接信息 在项目pom.xml文件夹中,找到liquibase插件,并修改数据库连...

  • Golang 搭建Tcp服务器

    数据库使用MongoDB,代码复制修改Tcp服务器ip和数据库地址即可使用,修改点已在代码里标注。

  • 一、初识SQL数据库-3使用SQL Server方式登录数据库

    SQLServer验证登录 (1)修改服务器身份验证方式:右键选择“服务器”——》属性 (2)修改sa(数据库超级...

  • MySQL的使用

    SHOW DATABASE显示当前服务器中的数据库 修改数据库:ALTER {DATABASE|SCHEMA} [...

  • DTCMS项目中使用

    服务器or本地部署 数据库本地安装sql2008导入旧项目的数据库备份文件数据库名称对应项目名进行修改 IIS服务...

  • 服务器修改时区

    查看服务器时间 修改时区 方法一 : 方法二 : 注意,修改时区后,若数据库是之前时区启动的,需要重启数据库

  • 设置远程连接 mysql

    进入 mysql 数据库 修改权限 更新权限 验证是否成功 重启服务

  • Table '库名.user' doesn't exist

    修改数据库账户名称时候遇到问题. 出现报错 修改用户名需要先use 数据库

网友评论

      本文标题:服务武器数据库修改8小时断连问题

      本文链接:https://www.haomeiwen.com/subject/hlwthqtx.html