# MySQl - Neue Datensätze "on the Fly" verarbeiten



## Spr3ng (17. Feb 2010)

Hallo,

ich schreibe zur Zeit einen kleinen IRC Bot. 
Dieser soll auf alle IRC Netzte connecten, die in einer Datenbank stehen.

Das sieht zur Zeit so aus:


```
//Alle Server connecten 
			rs = stmt.executeQuery("SELECT * FROM server");
			while (rs.next()) {
				
				String server_url = rs.getString(1);
				int port = rs.getInt(2);
				
				IrcBot bot = new IrcBot();
				
				bot.connect(server_url,port);
				
			}
```

Funktioniert auch sehr gut, allerdings muss ich jedesmal das Java Programm neustarten, wenn ich einen neuen IRC Server in die DB eingetragen habe, damit für diesen auch eine Bot Instanz eröffnet wird.

Meine Frage ist nun, ist es möglich Java zu veranlassen, bei einem neuen Eintrag in der DB eine Instanz mit den neu eingetragenen Werten zu starten?

Gruß


----------



## Bartleby (17. Feb 2010)

Du darfst dann nicht nur einmal die DB durchsuchen, sondern benötigst einen extra Thread, der z.B. alle 10 Minuten neu in der DB nachschaut, ob Einträge hinzugekommen sind, zu denen noch keine Connection besteht.


----------



## Firestorm87 (17. Feb 2010)

Naja wer sagt denn, dass du diese Abfrage nur beim Start den programmes machen darfst?

Du könntest das ganze auch auf einen Button legen oder automatisch alle halbe Stunde durchlaufen, oder oder oder....

Du müsstest dir dann nur merken, für welche Hosts bereits eine Instanz läuft...

/EDIT: kacke überholt worden ;(


----------



## Spr3ng (17. Feb 2010)

Zum einen, wie kann ich mir "merken" wo schon connected wurde.

Zum anderen geht es mir ja nicht darum, irgendeinen Button drücken zu müssen oder so ne alle 10min schleife reinzubasteln sonder ob es möglich ist, dass java erkennt, das ein neuer eintrag da ist und ihn dann verarbeitet. 

Trotzdem danke schonmal für eure ideen!


----------



## Firestorm87 (17. Feb 2010)

Naja so lange die Datenbank sich nicht bei dienem Java-Programm melden kann, kann das Programm ohne eine überprüfung auch nicht wissen, ob was neues da ist.

Gedanken lesen kann Java leider nicht... und Datenbanken verschicken auch keine Mails an dein Java Programm, wenn Sie neue Elemente enthalten 

Zum "merken" gibt es listen, Arrays, sets, textdatein... es würd ja genügen zu wisssen, ob die url doppelt ist...


----------



## Bartleby (17. Feb 2010)

Eine automatische Benachrichtigung funktioniert, wie schon gesagt wurde, nicht. Du könntest es so in der Art lösen:


```
Map<String, IrcBot> server = new HashMap<String, IrcBot>();

while(true){
   rs = stmt.executeQuery("SELECT * FROM server");
   while (rs.next()) {
       String server_url = rs.getString(1);
       if ( !server.contains(server_url) ) {
           int port = rs.getInt(2);
           IrcBot bot = new IrcBot();
           bot.connect(server_url,port);

           server.put(server_url, bot);
       }               
   }

   Thread.sleep(600000)
}
```

Oder du speicherst dir in der DB immer das Hinzugefügt-Datum, merkst dir das letzte Datum in deinem Programm und fährst dann direkt eine DB-Abfrage mit einer where-Einschränkung auf das letzte gemerkte Datum.


----------



## Gast2 (17. Feb 2010)

Mit einer Oracle könntest du UTL_HTTP oder UTL_TCP in Verbindung mit einem Trigger benutzen um nach einem INSERT deine Java App zu callen. MySQL kann das allerdigns nicht, könntest höchstens einen MySQL Proxy dazwischenschalten der bei einem INSERT deine Java App benachrichtigt.

MYSQL ::


----------



## Tharsonius (17. Feb 2010)

Wenn Du das eintragen der IRC Server ebenfalls durch Dein Programm machst, dann würde es sich doch anbieten diese neu hinzugefügte Instanz direkt zu starten oder zumindest zu prüfen, was noch nicht läuft.


----------



## Spr3ng (7. Mrz 2010)

danke euch allen, habs ähnlich gelöst wie Bartleby vorgeschlagen hat.


----------

