php连接mysql使用一段时间后连接数据库超时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php连接mysql使用一段时间后连接数据库超时相关的知识,希望对你有一定的参考价值。

单位的门户网站,用的php5.2.0+mysql5。
该网站用了一段时间以后,页面就加载不出来了。查了下原因,是访问数据库记录文章信息的表的查询超时。用navicat工具访问数据库,可以连接,但是打开该文章表速度会比较慢,但是10秒左右也能打的开。该表数据量不多,才4000多条记录而已。如果页面上没有访问该表的语句,页面可以正常加载,就是说访问其他表都正常,就这一张表会超时。
这种情况出现了3次了,平均1个月多点就出一次,每次只能把服务器重启才有用,单独重启数据库都没效果。
不知道到底是什么原因啊。

参考技术A

    开启下mysql的慢查询. 看看是否存在过多的慢查询语句. 具体开启方式可以百度 

    在数据库访问比较慢的情况下. 执行 show processlist 看下进程是否过多.

 

找出慢查询之后, 可以针对sql进行优化.

加加索引应该就能解决.

my.cnf 的配置可以参考网上的方案进行优化....

(按说...4000条数据根本就不是个问题....)

追问

要等到下次出问题估计还要等个把月,问题在于内网平台不能长时间断着,没有充足的时间给我排查问题。而且考虑只有这一张表会出问题,我都怀疑是不是apache的问题。

追答

一般不会是apache的问题. 看下php的error_log吧

本回答被提问者和网友采纳
参考技术B php连接mysql读写数据,过一天就不work了。
经查发现mysql connection默认的超时时间为8小时。如果想让这个连接永久不超时,该怎么办呢?
有朋友说在mysql配置文件my.cfg中[mysqld]中添加
wait _timeout =31536000 (这里的这个数字的单位是秒,31536000秒=365天,这也是可设置的最大值)

这个办法不是最好的,因为这个"一年" != 永久..如何才能让该连接永久不超时呢?

比较完美的解决方法:

复制代码代码如下:
function reconnect()
if (!mysql_ping ($this->db))
//here is the major trick, you have to close the connection (even though its not currently working) for it to recreate properly.
mysql_close($this->db);
$this->connect();



其中的mysql_ping()用来判断连接是否已经被断开了,若是断开了,关闭当前的链接,重新创建新的连接。
这样,只要发现连接被断开了,即可重新连接了。
参考技术C 没遇到过就单独一张表不能访问的情况,,,
话说你用navicat,需要花10秒,重启数据库无效,重启服务器就好了,估计问题出在服务器上。
参考技术D 服务器不行了,再要简化你的程序调用数据库的次数,最好就能生成静态

JDBC 连接:超时后未重新连接

【中文标题】JDBC 连接:超时后未重新连接【英文标题】:JDBC Connection: Not Recconecting after Timeout 【发布时间】:2014-09-24 20:27:27 【问题描述】:

在我的应用程序中没有使用连接一段时间后,下一次尝试检索有效连接会引发 JDBC 异常:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:从服务器成功接收到的最后一个数据包是 81,155,040 毫秒前。最后一个成功发送到服务器的数据包是在 81,155,040 毫秒前。比服务器配置的“wait_timeout”值长。您应该考虑在应用程序中使用之前使连接失效和/或测试连接有效性,增加客户端超时的服务器配置值,或使用 Connector/J 连接属性“autoReconnect=true”来避免此问题。

我想知道应该更改哪个配置以避免此问题。

我通过 Hibernate SessionFactory 管理应用程序级别的连接,池和连接管理在此级别完全不可见。在处理 SessionFactory 时,我是否必须尝试检查和检索全新的连接?及时:我也在使用 Spring。

Server.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Server port="8005" shutdown="SHUTDOWN">

  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <Listener className="org.apache.catalina.core.JasperListener"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.ServerLifecycleListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>

  <GlobalNamingResources>

        <Resource auth="Container"
                  description="User database that can be updated and saved" 
                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
                  name="UserDatabase" 
                  pathname="conf/tomcat-users.xml" 
                  type="org.apache.catalina.UserDatabase"
        />

        <Resource auth="Container" 
                  driverClassName="com.mysql.jdbc.Driver" 
                  initialSize="20"                              
                  global="mysql/GestaoProjetos" 
                  maxActive="800" 
                  maxIdle="20" 
                  maxWait="30000" 
                  minEvictableIdleTimeMillis="10000" 
                  name="mysql/GestaoProjetos" 
                  password="laranja" 
                  removeAbandoned="true" 
                  removeAbandonedTimeout="300" 
                  testOnBorrow="true" 
                  testWhileIdle="true" 
                  timeBetweenEvictionRunsMillis="10000" 
                  type="javax.sql.DataSource" 
                  url="jdbc:mysql://localhost/GestaoProjetos?autoReconnect=true" 
                  username="tomcat" 
                  validationQuery="SELECT 1"
                  validationInterval="30000"
        />

  </GlobalNamingResources>

  <Service name="Catalina">

      <Connector connectionTimeout="20000" 
                 port="80" 
                 protocol="HTTP/1.1" 
                 redirectPort="443"
      />

      <Connector port="9" 
                 protocol="AJP/1.3" 
                 redirectPort="443"
      />

      <Engine   defaultHost="localhost" 
                name="Catalina">

                <Realm  className="org.apache.catalina.realm.UserDatabaseRealm" 
                        resourceName="UserDatabase"
                />

                <Host appBase="webapps" 
                      autoDeploy="true" 
                      name="localhost" 
                      unpackWARs="true" 
                      xmlNamespaceAware="false" 
                      xmlValidation="false">

                        <Context docBase="GestaoProjetos" 
                                 path="/GestaoProjetos" 
                                 reloadable="true" 
                                 source="org.eclipse.jst.jee.server:GestaoProjetos"
                                 crossContext="true"
                        />

                </Host>
      </Engine>
  </Service>
</Server>

hibernate.cfg.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory name="SessionFactoryUtil">
        <property name="hibernate.connection.driver_class">org.gjt.mm.mysql.Driver</property>
        <property name="hibernate.connection.username">USERNAME</property>
        <property name="hibernate.connection.password">PASSWORD</property>
        <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/GestaoProjetos?autoReconnect=true</property>
        <property name="hibernate.connection.pool_size">200</property>
        <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
        <property name="hibernate.current_session_context_class">thread</property>
        <property name="hibernate.connection.release_mode">after_transaction</property>
        <property name="hibernate.show_sql">false</property>
        <property name="hibernate.format_sql">true</property>
        <property name="hibernate.generate_statistics">true</property>
        <!-- Automatic schema creation (begin) === -->
        <property name="hibernate.hbm2ddl.auto">update</property>
        <!-- property name="mappingJarLocations">file:/WEB-INF/lib/</property> --> 
    </session-factory>
</hibernate-configuration>

【问题讨论】:

在 Spring/Hibernate 中提供配置以从数据源检索数据库连接。 @LuiggiMendoza,添加了休眠配置文件。谢谢。 所以你毕竟没有使用你的数据源,你让 Hibernate 具有天真和 不得在生产中配置,这将每次手动打开连接,并且您需要手动关闭。看起来你还没有关闭连接,所以你的问题。 @LuiggiMendoza:在我将 Hibernate 的配置代码复制到编辑问题的那一刻,我就有这种感觉。如何更改 Hibernate 配置以使用 Tomcat 的 Server.xml 中的连接池而不是它自己的(如果可能)? 你通常集成 Spring 和 Hibernate。网上有很多关于它的教程。他们还解释了如何使用来自外部数据源的连接池。 【参考方案1】:

答案是停留在错误中;

autoReconnect=true

将此参数添加到您的连接 url 的末尾。

【讨论】:

这应该是一条评论

以上是关于php连接mysql使用一段时间后连接数据库超时的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 连接到数据库

超时重新连接 MySQL

Derby/JDBC 连接生命周期(或空闲超时)

JDBC 连接:超时后未重新连接

jboss wildfly 数据源连接失败 - 在配置的阻塞超时内没有可用的托管连接

MySQL连接超时自动断开连接应该怎样处理