Bug #13022 slowing down without traffic
Submitted: 6 Sep 2005 20:27 Modified: 6 Oct 2005 11:53
Reporter: Jens Doll Email Updates:
Status: Not a Bug Impact on me:
None 
Category:MySQL Server Severity:S1 (Critical)
Version:4.1 OS:Windows (Windows XP Pro)
Assigned to: MySQL Verification Team CPU Architecture:Any

[6 Sep 2005 20:27] Jens Doll
Description:
My machine R2D2 is a Win XP Pro machine, which works as file server, Servlet container and MySQL machine.

The MySQL 4.1 Server is not a very busy one. There are only a few selects a day. 

After boot the server works normally, but after hours it slows down to response times of several minutes and the machine is blocked, except the Tomcat 5, which still serves.

Don't know, where to search.

How to repeat:
Install the same configuration (Win XP Pro, Tomcat 5, MySQL 4.1, Win XP Pro client) and wait for 20 hours.
[6 Sep 2005 20:43] MySQL Verification Team
Not enough information was provided for us to be able
to handle this bug. Please re-read the instructions at
http://bugs.mysql.com/how-to-report.php

If you can provide more information, feel free to add it
to this bug and change the status back to 'Open'.

Thank you for your interest in MySQL.
[10 Sep 2005 20:09] Jens Doll
The cause lies in the following JAVA bean, which calls MYSQL. Aan Open connection, an insert/update, a commit  and a close connection.:

----------- jsp code calling bean ---------------
<% String Referrer = ""; String[] paths = request.getParameterValues("referrer");
 if (paths != null) if (paths.length > 0)  {Referrer = request.getScheme() + "://" + request.getServerName() + paths[0];}
 if (Referrer.equals("")) Referrer = request.getRequestURL().toString(); %>
<jsp:useBean id='monitor' scope='session' class='datenbankzugriff.Monitoring' type="datenbankzugriff.Monitoring" />
<jsp:setProperty name="monitor" property="addr"  value="<%= request.getRemoteAddr() %>" />
<jsp:setProperty name="monitor" property="host"  value="<%= request.getRemoteHost() %>" />
<jsp:setProperty name="monitor" property="url"   value="<%= request.getRequestURL().toString() %>" />
<jsp:setProperty name="monitor" property="referrer"   value="<%= Referrer %>" />
<jsp:setProperty name="monitor" property="stats" value="" />
<jsp:setProperty name="monitor" property="close" value="<%= Referrer %>" />

----------- bean monitoring ---------------------
package datenbankzugriff;

/**
 * <p>Title: </p>
 *
 * <p>Description: </p>
 *
 * <p>Copyright: Copyright (c) 2005</p>
 *
 * <p>Company: </p>
 *
 * @author not attributable
 * @version 1.0
 */

import java.sql.*;
import java.net.*;
import java.io.*;
import java.util.*;

import javax.servlet.*;
import javax.servlet.http.*;

public class Monitoring {

    String urlprod     = "jdbc:mysql://myhost:3306"; // production
    String urltest     = "jdbc:mysql://mytesthost:3306"; // test
    String database    = "/monitoring";
    Connection con     = null;
    Statement sqlstmt  = null;
    ResultSet result   = null;
    String lastmessage = null;
    String urlfrom     = null;
    long Recordcount   = 0;
    String Addr        = null;
    String Host        = null;
    String Url         = null;
    String Referrer    = null;
    String Hostname    = null;

    public Monitoring() {
        super();

    }

    private void DbTry(String ipfrom) {
        Recordcount = 0;
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
        } catch (Exception ex) {
            ex.printStackTrace();
            lastmessage = "Failed to load mSQL driver.";
            return;
        }
        try {
            // first try production database
            con = DriverManager.getConnection(urlprod + database, "monitor",
                                              "pw");
            sqlstmt = con.createStatement();
        } catch (SQLException ex) {
            try {
                // then try test database
                con = DriverManager.getConnection(urltest + database, "monitor",
                                                  "pw9999999");
                sqlstmt = con.createStatement();
            } catch (SQLException ex1) {
                ex1.printStackTrace();
                lastmessage = "M=" + ex1.getMessage()
                              + "S=" + ex1.getSQLState()
                              + "C=" + ex1.getErrorCode();
            }
        }
        try {
            sqlstmt = con.createStatement();
            result = sqlstmt.executeQuery(
                    "select count(*) from monitoring.urltable where ip='" +
                    ipfrom + "'");
            result.next();
            Recordcount = (int) result.getLong(1);
        } catch (SQLException ex) {
            ex.printStackTrace();
            lastmessage = "M=" + ex.getMessage()
                          + "S=" + ex.getSQLState()
                          + "C=" + ex.getErrorCode();
        }
    }

public String getIpaddress(String hostname) {
  String ipaddr = "";
  try {
      InetAddress inet = InetAddress.getByName(hostname);
      ipaddr = inet.getHostAddress();
  }
  catch (Exception ex) {
      System.out.println (ex.toString());
  }
  return ipaddr;
}

public String getHostname(String ipaddr) {
    String hostname = "";
    try {
      InetAddress inet = InetAddress.getByName(ipaddr);
      hostname = inet.getHostName();
    }
    catch (Exception ex) {
        System.out.println (ex.toString());
    }
   return hostname;
}

 public long getIpcount(String ipfrom) {
        if (result == null) {
            DbTry(ipfrom);
        }
        return Recordcount;
    } // process results one row at a time

public void setStats(String non) { // initializes record;
      setIpaddr(Host, Addr, Url);
    }

public void setAddr(String a) { // initializes record;
      Addr = a;
      Hostname = getHostname(a);
    }

    public void setHost(String a) { // initializes record;
      Host = a;
    }

    public void setUrl(String a) { // initializes record;
      Url = a;
    }

    public void setReferrer(String referrer) { // initializes record;
        Referrer = referrer;
    }

    public void setIpaddr(String urlfrom, String ipfrom, String urlvisited) { // initializes record;
        getIpcount(ipfrom);
        if (Recordcount == 0) {  // perform insert
            try {
                String Stt =  "insert into monitoring.urltable (urlfrom, ip, urlvisited, count, firstdate, lastdate, referrer, hostname) values(\"" +
                              urlfrom + "\", \"" + ipfrom + "\", \""+ urlvisited + "\", 1, current_timestamp, current_timestamp, \""+Referrer+"\", \""+Hostname+"\")";

                sqlstmt.executeUpdate ( Stt );
            } catch (SQLException ex) {
                ex.printStackTrace();
                lastmessage = "M=" + ex.getMessage()
                              + "S=" + ex.getSQLState()
                              + "C=" + ex.getErrorCode();
            }
        }
        else {  // perform update
            try {
                String Stt = "update monitoring.urltable set count = count + 1, lastdate = current_timestamp where urlfrom = \"" +
                           urlfrom + "\" and urlvisited = \""+urlvisited + "\" and ip = \"" + ipfrom + "\"";

                sqlstmt.executeUpdate( Stt );
            } catch (SQLException ex) {
                ex.printStackTrace();
                lastmessage = "M=" + ex.getMessage()
                              + "S=" + ex.getSQLState()
                              + "C=" + ex.getErrorCode();
            }
        }
        // now commit insert or update
        if (result != null) {
            try {
                sqlstmt.executeUpdate("commit");
            } catch (SQLException ex) {
                ex.printStackTrace();
                lastmessage = "M=" + ex.getMessage()
                              + "S=" + ex.getSQLState()
                              + "C=" + ex.getErrorCode();
            }
        }
    }

    public void setClose(String a) {  // closes the database
           try {
               con.close();}
           catch (Exception ex) {
               ex.printStackTrace();
               lastmessage = "M=" + ex.getMessage();}}

}
[10 Sep 2005 20:13] Jens Doll
Hello Miguel,

the code, which I atteched could perhaps help you in the investigation.

Regards
Jens.
[11 Sep 2005 16:44] Jens Doll
and here is the missing table definition
------------ table monitoring.urltable ------------------
CREATE TABLE `urltable` (
  `urlfrom` varchar(48) NOT NULL default '',
  `count` int(10) unsigned NOT NULL default '0',
  `username` varchar(48) NOT NULL default '',
  `ip` varchar(16) NOT NULL default '',
  `cookie` varchar(45) NOT NULL default '',
  `firstdate` datetime NOT NULL default '0000-00-00 00:00:00',
  `lastdate` datetime NOT NULL default '0000-00-00 00:00:00',
  `urlvisited` varchar(48) NOT NULL default '',
  `referrer` varchar(45) NOT NULL default '',
  `hostname` varchar(45) NOT NULL default '',
  PRIMARY KEY  (`urlfrom`,`ip`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
[25 Sep 2005 14:47] MySQL Verification Team
If you are using host names please do the following test on your side:
start the server including the start option: skip-name-resolve and
connect client using IP numbers.

Thanks in advance.
[6 Oct 2005 10:16] Jens Doll
The IP resolution could have been the cause. I substituted the hostnames by localhost (not a remote hostname!) and the site is seems to be OK. Is this a Windows XP problem? I plan to migrate to Linux ... Thanks.
[6 Oct 2005 11:53] MySQL Verification Team
Thank you for the feedback. I guess that issue is an OS setting issue
so you need to read the Manual and Technical articles about, DHCP
if you have enabled and so on.
I am changing for not a bug since isn't a server issue. Thanks.