# Datenbank aktualliesieren !



## manuela (24. Sep 2008)

Hallo,

Toll jetzt habe ich das eine Problem lösen können und jetzt das nächste.

ich habe meinen Datensatz gespeichert. in der Datenbank(MySql) kann ich auch die Veränderung sehen.

ich schliesse meinen Datensatz und lade diesen mit einem (Select * from .... where nr = 22019) 
und wie ich schon gesagt habe ist der Datensatz in der Datenbank verändert. aber es öffnet sich der Datensatz bevor ich diesen verändert habe. ( Jetzt kommt sicher die Antwort rollback oder so .. ich habe aber keinen commit oder ähnliches gemacht. 

wenn ich mein programm beende und neu starte dann ist auch der Datensatz aktuell.

was kann ich machen das er mir immer den aktuellen (in der datenbank veränderten datensatz anzeigt.)

Gruß Manuela.


----------



## FArt (24. Sep 2008)

Vermutlich läuft der commit implizit (autocommit).

Wenn noch "die alten Daten" zu sehen sind, sind evtl. Caches im Spiel oder es ist ein Anwenderfehler, für den man aber *minimalen Beispielcode* benötigt, um das Problem zu lokalisieren.

Ist das ResultSet geschlossen worden? Neues Statement?


----------



## HoaX (24. Sep 2008)

wenn du keinen commit gemacht hast solltest du vielleicht einen machen?

ansonsten liegt die vermutung nahe dass du den datensatz nicht wirklich neu aus der db lädst


----------



## Mindi1975 (24. Sep 2008)

Das mit den "alten" Einträgen ist leider sehr häufig so, dass diese erst nach einem Programmneustart "aktuell" sind.

Ich schließe nach einer Aktualisierung von DB Einträgen grundsätzlich die Verbindung und öffne sie danach neu. 

Ist im Bezug auf die Geschwindigkeit zu vernachlässigen, wenn nicht mehrere 1000 Einträge gemacht werden und sofort nach dem Eintrag damit gearbeitet werden muss.


----------



## manuela (24. Sep 2008)

Hallo



> Das mit den "alten" Einträgen ist leider sehr häufig so, dass diese erst nach einem Programmneustart "aktuell" sind.
> 
> Ich schließe nach einer Aktualisierung von DB Einträgen grundsätzlich die Verbindung und öffne sie danach neu.
> 
> Ist im Bezug auf die Geschwindigkeit zu vernachlässigen, wenn nicht mehrere 1000 Einträge gemacht werden und sofort nach dem Eintrag damit gearbeitet werden muss.



genauso habe ich jetzt auch gemacht aber ist doch schon zimmlich nerfig, aber was sollst.

Gruß Manuela


----------



## Guest (25. Sep 2008)

Hallo Manuela!



			
				manuela hat gesagt.:
			
		

> [...] ich habe aber keinen commit oder ähnliches gemacht[...]



Nach einer Datenänderung muss generell ein Commit erfolgen.

MySQL kennt zwei Betriebsarten:
Das Commit erfolgt automatisch ("Autocommit" ist eingeschaltet) oder es muss extra angestoßen werden.

Auf der MySQL-Konsole kannst du so

```
SELECT @@autocommit;
```
den Status abfragen.

Grüße
Gast


----------



## Guest (25. Sep 2008)

hallo,



> MySQL kennt zwei Betriebsarten:
> Das Commit erfolgt automatisch ("Autocommit" ist eingeschaltet) oder es muss extra angestoßen werden.
> 
> Auf der MySQL-Konsole kannst du so
> ...



also autocommit ist eingeschaltet  ich bekomme eine 1 angezeigt.

Gruß Manuela


----------



## Guest (26. Sep 2008)

Hallo Manuela,

leider hab ich jetzt nicht viel Zeit ...

Ich arbeite seit Jahren mit MySQL und mir ist es noch nie passiert, dass ich mich mit veralteten Daten herumschlagen musste. (Mit PHP und Java)

Arbeitest du ganz normal mit JDBC?

Zeig mal deinen Code

Grüße
Gast


----------



## HoaX (26. Sep 2008)

ich denke auch dass du wohl beim auslesen einen fehler machst -> code zeigen


----------



## manuela (26. Sep 2008)

Hallo Leute,

hier nun mein Connector


```
private static final String treiber = "com.mysql.jdbc.Driver";
 
    

    public Connector() {
        try {
                     Class.forName(treiber);

        } catch (ClassNotFoundException e) {
            e .printStackTrace();
        }
           
    }


    public static Connector getInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Connector();
        }
        return uniqueInstance;
    }



   public Connection getConnection() {
             return connection;
    }


   public void connect() {
        try {
           conProp.put(DATABASE_USER, name.toLowerCase());
           conProp.put(DATABASE_PASSWORD, passw);
           conProp.put(MYSQL_AUTO_RECONNECT,"true");
           conProp.put(MYSQL_MAX_RECONNECTS, "10");
             
            connection = DriverManager.getConnection("jdbc:mysql://10.192.145.10/"+datenbank,conProp);          
           
        } catch (NoSuchAlgorithmException ex) {
   
        } catch (SQLException e) {
    
             disconnect();            

            e.printStackTrace();

        }

    }

    public void disconnect() {
        try {
            connection.close();
            
        } catch (SQLException e) {
 
            e.printStackTrace();
        }
    }
```

das ist mein connector. 
wenn ich jetzt  über einen Socketverbindung meine Daten(rohdaten als String[]) verarbeiten lasse was auch wunderbar funktioniert weil ich da die Veränderten Daten auch zurück bekomme .
schliesse ich jetzt meinen Datensatz und öffne diesen wieder mit 



```
Statement stmt = Connector.getInstance().getConnection().createStatement();

String sql = "Select * from .... where nr = 2222";
stmt.executeQuery(sql);
ResultSet r = ....
```

dann bekomme ich die alten Daten angezeigt.

mache ich aber 


```
Connector.getInstance().disconnect();
Connector.getInstance().connect();
Statement stmt = Connector.getInstance().getConnection().createStatement();

String sql = "Select * from .... where nr = 2222";
stmt.executeQuery(sql);
ResultSet r = ....
```
dann bekomme ich die neuen Daten.

Es kommen jetzt siecher die Frage auf ob der server noch nicht Fertig ist ?
Antwort: 
Ich bekomme ja direkt nach der Verarbeitung die Aktuellen Daten vom Sever geschickt.(Der socket wird geschlossen).

aber halt nicht von der Datenbank!!!! 

wenn ich den neu aufrufe.



Gruß Manuela


----------



## Gast (26. Sep 2008)

Ich blick da nicht ganz durch bei deiner Roh- und Feindatenverarbeitung.

Was ist eigentlich der Zweck des Programms?


----------



## maki (26. Sep 2008)

Der Code den du zeigst (Connector Klasse) ist zwar seltsam aber auf jedenfall nicht nicht threadsicher.

Wie dem auch sei, die Ursache deines Problems ist nicht in diesem Code.

Welche Version des Treibers und des Servers nutzt du?

Dieses Problem mit MySQL ist mir neu.


----------



## manuela (26. Sep 2008)

Hallo,

also ich benutze 

den mysql-connector-java-5.1.6-bin.jar 
nach dem der 
 mysql-connector-java-5.1.5-bin.jar 
das verhalten gezeigt hat.




der mysql  ist MySQL 5.1.28-rc-community via TCP/IP

Client Info 
MySQL Client Version 5.1.11


Gruß Manuela


----------



## maki (27. Sep 2008)

Hab ein bisschen gegoogelt, alles was ich dazu finde ist, dass die Änderung nicht committed wurde, mach doch mal ein Connector.getInstance().getConnection().commit() nach dem Einfügen.


----------



## Guest (27. Sep 2008)

Hallo,

mache ich 


> Hab ein bisschen gegoogelt, alles was ich dazu finde ist, dass die Änderung nicht committed wurde, mach doch mal ein Connector.getInstance().getConnection().commit() nach dem Einfügen.



bekomme ich folgende Fehlermeldung :

Can't call commit when autocommit=true


----------

