# Neuer Query wird nicht erkannt



## DayXtry (8. Dez 2006)

Hi,
ich habe ein kleines Testprogramm für die Anbindung von MySQL geschrieben.
Auf der ersten JSP Seite habe ich ein Eingabefeld, wo der Query eingegeben wird. Beim drücken des Submit Buttons wird auf die zweite JSP Seite weitergeleitet, welche die Java Klasse aufruft, und den Query abarbeitet. Das Ergebnis des Querys wird dann in der zweiten JSP Seite angezeigt.
Mein Problem ist, dass wenn ich von der zweiten Seite wieder zurück zur ersten gehe, und einen anderen Query eingebe, wird immer noch der letzte Query ausgeführt,...egal wie oft ich es versuche,...der neue Query wird erst ausgeführt, wenn ich meinen Tomcat neu starte.
Wisst ihr evtl. woran das liegen könnte?
Nach jedem abgearbeiteten Query schließ ich die MySQL Connection und das Statement. Beim Absetzen eines neuen Querys wird wieder eine neue Verbindung erzeugt.

MfG
DayXtry


----------



## SlaterB (8. Dez 2006)

tja, das liegt entweder an einem Browser-Cache oder an einem Fehler in deinem Programm,

mache dort doch mal Logausgaben:
"neuer Request mit Parameter query = .. angekommen",
"führe Query .. aus"

usw.

schaue im DB-Log ob überhaupt mehrere Anfragen gestellt werden


----------



## DayXtry (8. Dez 2006)

Danke für die schnelle Antwort!!!

Also, ich hab jetzt mal volgendes gemacht:
Programm ausgeführt -> Query abgesetzt -> Anzeige erfolgreich geladen -> Browser geschlossen -> Programm neu ausgeführt (ohne Tomcat neustart) -> Query Abgesetzt -> Anzeige des neuen Querys erfolgreich geladen


Schließ ich den Browser nicht, sondern ruf einfach das Programm erneut im Browser auf, wird das Ergebnis des letzten Querys angezeigt.

D.h. es liegt am Cache des Browsers...was kann man dagegen machen?

MfG
DayXtry


----------



## SlaterB (8. Dez 2006)

z.B. den Browser benennen..

da wirds doch wohl Einstellungen zum Caching geben, oder eine Hilfe,
oder bei google
'browsername caching ausschalten'
eintippen

oder du willst im Server bestimmte Einstellungen, die dem Browser mitteilen, dass er nicht cachen soll?
gibts wohl, ich selber weiß das grad nicht so genau, eher was für ein HTML-Forum


----------



## DayXtry (8. Dez 2006)

Danke für die Antwort...
Aber so wirklich hilft mir das nicht weiter,...wenn ich das Caching des Browsers bei mir ausschalte, dann bringt das später ja nicht wirklich was, wenn das Programm auf nem Server läuft, und andere User darauf zugreife. Bei denen wird ja das Problem dann auch auftreten.
Irgend wie kommt mir das n bissl komisch vor, dass das mit dem Cache des Browsers zusammenhängen soll. Denn früher, als ich mit PHP und MySQL programmiert hab, ist so ein Prob nie aufgetreten. Und jetzt wo ich mit Java programmier, soll der Cache schon nach einer DB Abfrage voll sein,...hmmmm...


----------



## SlaterB (8. Dez 2006)

wie gesagt ist das dann eher eine allgemeine Frage
'wann und warum cachen Browser HTML-Seiten, wie steuert man das, wie verhindert man das'

das ist eher was für ein HTML-Forum,
der Browser weiß nicht, und kann auch nicht wissen ob der Server nun PHP oder Java verwendet,

aber es liegt wahrscheinlich durchaus auch an den Einstellungen des  Java-Servers,
also nicht ganz falsch hier,
wenn auch in der falschen Unterarea + falscher TopicTitel 
wer weiß ob sich ein J2EE-Experte hierher verirrt,
vielleicht neu aufmachen


----------



## DayXtry (8. Dez 2006)

ok....auf jedenfall danke für deine Hilfe


----------



## DayXtry (8. Dez 2006)

hmmmm...so langsam bin ich davon überzeugt, dass es nicht am Cache liegt.
Ich speicher nämlich die vom Query zurückgelieferten Werte in einer HashMap...wenn ich jetzt am Ende die HashMap leer und dann erneut einen Query schicke, wird mir kein Ergebnis angezeigt, also so zu sagen nur die leere HashMap.

Hier mal der Code (ich hoffe dass es hier nicht zu voll wird):

Die index.jsp enthält nur ein Formular wo man den Query eingibt:

```
<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

    <form name="form1" action="next_index.jsp" method="post">
        <input type="text" name="query">
        <input type="submit" name="submit" value="Ausführen">
    </form>
    
    </body>
</html>
```


next_index.jsp ist die Datei, in welcher auf die Java Klasse zugegriffen wird, und eine Verbindung zum MySQL Server erzeugt wird. Des weiteren werden hier die Ergebnisse angezeigt:

```
<jsp:useBean id="sql" class="mysql_test.mysql_actions" scope="session" />

<%@page contentType="text/html" import="java.sql.Connection,java.sql.Statement,java.sql.ResultSet,java.util.HashMap"%>
<%@page pageEncoding="UTF-8"%>


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>

    <%
       Connection con = null;
       con = sql.getConnection("db_account");
       
        if(con != null) {
    %>
        Verbindung wurde aufgebaut

    <%
        }else {
    %>
        Verbindung konnte nicht aufgebaut werden

    <%
        }
       String query = request.getParameter("query");
       ResultSet rSet = sql.executeQuery(query);

       HashMap hash = new HashMap();
       hash = sql.getResult(rSet);
       
       
       int cCount = sql.getColumnName().length;
       String[] cName = new String[cCount];
       cName = sql.getColumnName();

    %>
    Size: <%=sql.getColumnCount()%>
    <table border="1">
        <tr>
    
    <%
       for(int i=0; i<cCount; i++) {
    %>
            <th><%=cName[i]%></th>
    <%
       }
    %>
        </tr>
        <tr>
    <%


       if(hash != null) {
       for(int i=1; i<=hash.size(); i++) {
    %>
            <td><%=hash.get(String.valueOf(i).toString())%></td>
    <%
            if(i%cCount == 0) {
    %>
               </tr>
               <tr>
    <%
            }
       
        }
       }
       else {
    %>
        keine daten
    <%}%>
    
    </table>

    <%
       rSet.close();
       hash.clear();
       sql.endConn();
    %>
    
    [url="index.jsp"]Neuer Query[/url]
    
    </body>
</html>
```


mysql_actions.java ist die Klasse, wo wie der Name schon sagt, alle MySQL Aktionen durchgeführt werden:

```
/*
 * mysql_actions.java
 *
 * Created on 06. Dezember 2006, 14:02
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package mysql_test;

/**
 *
 * @author ulrichju
 */


import java.beans.*;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.sql.*;
import java.util.HashMap;

import javax.swing.*;


public class mysql_actions {
    
    private Connection conn;
    private Statement stmt;
    private ResultSet rSet;
    private String[] Result;
    private int arraySize;
    private int ColumnCount;
    private String[] ColumnName;
    private HashMap hashDaten = new HashMap();
    
    /** Creates a new instance of mysql_actions */
    public mysql_actions() {
        conn = getConnection("db_account");
        //getResult(executeQuery("SELECT * FROM orders"));
    }
    
//*******************************************************************************************************
    
    public static void main(String[] args) {
        mysql_actions ma = new mysql_actions();
    }
    
//*******************************************************************************************************
    
    public Connection getConnection(String dbName) {
        Connection con = null;
        
        // Create a new MySQL Driver Instance
        try {
            System.out.println( "Create a new MySQL Driver Instance");
            Class.forName("org.gjt.mm.mysql.Driver").newInstance();
        } catch ( Exception e ) {
            System.out.println( "ERROR: the MySQL Driver couldn't be created");
            e.printStackTrace(); 
        }
        
        
        try {
            System.out.println("Connect to MySQL " + dbName);
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/" + dbName, "root", "admin");
        }
        catch(SQLException sqe) {
            System.out.println("Couldn't acces MySQL database " + dbName);
            sqe.printStackTrace();
        }
        
        return con;
    }
    
//*******************************************************************************************************
    
    public ResultSet executeQuery(String query) {
        try {
            stmt = conn.createStatement();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        Object[] options = { "OK" };
        JOptionPane.showOptionDialog(null, query, "Warning", JOptionPane.DEFAULT_OPTION, JOptionPane.ERROR_MESSAGE, null, options, options[0]);
        try {
            rSet = stmt.executeQuery(query);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        
        setColumnCount(rSet);
        System.out.println("size: " + getColumnCount());

        return rSet;
    }
    
//*******************************************************************************************************
    
    public void setColumnCount(ResultSet rS) {
        try {
            ResultSetMetaData meta = rS.getMetaData();
            ColumnCount = meta.getColumnCount();
            
            setColumnName(meta);
        }
        catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
//*******************************************************************************************************
    
    public int getColumnCount() {
        return ColumnCount;
    }
    
//*******************************************************************************************************
    
    public void setColumnName(ResultSetMetaData meta) {
        ColumnName = new String[getColumnCount()];
        
        int j=1;
        for(int i=0; i<getColumnCount(); i++) {
            try {
                ColumnName[i] = meta.getColumnName(j);
                j++;
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
    
//*******************************************************************************************************
    
    public String[] getColumnName() {
        return ColumnName;
    }
    
//*******************************************************************************************************
    
    public HashMap getResult(ResultSet rSet) {
        int i=1;
        try {
            while(rSet.next()) {
                for(int j=1; j<=getColumnCount(); j++) {
                    hashDaten.put(Integer.toString(i), rSet.getString(j));
                    System.out.println(rSet.getString(j));
                    i++;
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
        
        return hashDaten;
    }
    
//*******************************************************************************************************

    public void endConn() {
        try {
            rSet.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
        
        try {
            stmt.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }

        try {
            conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }
    
}
```


----------



## DayXtry (8. Dez 2006)

ok,...Problem wurde gelöst...danke


----------



## SlaterB (8. Dez 2006)

dein ganzer Code hätte ansonsten nicht interessiert, 

wie ich am Anfang sagte, das einzige was die zweite Action machen sollte, 
wäre eine Ausgabe 'ich habe query .. erhalten',
damit ließe sich jede Cache-Frage eindeutig klären


----------



## DayXtry (8. Dez 2006)

jup, aber da es am Ende doch nicht am Cache lag, sondern ein Fehler im Programm an sich war, wäre der gesamte Quelltext schon von Interesse gewesen ...


----------

