Klaus1: Verständnisproblem: MySQL-Queries in Node.js

Beitrag lesen

Hallo,

ich verwende node.js mit Library promise-mysql, da ich voneinander abhängige Queries benötige, also nicht vollkommen aynchron laufen dürfen.

Soweit so gut, das funktioniert erstmal so:

pool = mysql.createPool(mysqlConnData);

param1 = 23;
param2 = 70;
param3 = 163; 
param4 = 295;

console.log("Start");

	pool.getConnection()
	.then(function(conn){
		connection = conn;
		var result = connection.query('select feldtyp from werte where idnr = ?', param1);
		return result;
	}).then(function(rows){
		console.log("1. "+rows[0].feldtyp);
		var result = connection.query('select feldtyp from werte where idnr = ?', param2);
		return result;
	}).then(function(rows){
		console.log("2. "+rows[0].feldtyp);
		var result = connection.query('select feldtyp from werte where idnr = ?', param3);
		return result;
	}).then(function(rows){
		console.log("3. "+rows[0].feldtyp);
		var result = connection.query('select feldtyp from werte where idnr = ?', param4);
		return result;
	}).then(function(rows){
		console.log("4. "+rows[0].feldtyp);
		connection.release();
		return;
	}).catch(function(error){
		if (connection && connection.release) connection.release();
		//logs out the error
		console.log(error);
	});

console.log("fertig");

Dabei wird folgende Ausgabe erzeugt:

Start
fertig
1. datum
2. zeit
3. text
4. farbe

Das schon fertig ausgegeben wird, vor den Datenbank-Abfragen, habe ich so verstanden, dass die Abfragen asynchron ausgeführt werden und die Abfrage nicht so schnell ist wie die weitere Ausführung des Programms.

Dann habe ich das Script angepasst und das Ganze in eine While-Schleife gepackt:

i = 0;
while (i < 5) {
	i ++;
	console.log("Durchlauf Nr. "+i);
	pool.getConnection()
	...

Das hatte dann die folgende Ausgabe zur Folge:

Start
Durchlauf Nr. 1
Durchlauf Nr. 2
Durchlauf Nr. 3
Durchlauf Nr. 4
Durchlauf Nr. 5
fertig
1. datum
2. zeit
3. text
4. farbe
1. datum
2. zeit
3. text
4. farbe
1. datum
2. zeit
3. text
4. farbe
1. datum
2. zeit
3. text
4. farbe
1. datum
2. zeit
3. text
4. farbe

Jetzt könnte es zwar noch sein, dass es immer noch zu schnell wäre, aber selbst bei 1000 sieht das Ergebnis so aus. Das verstehe ich schon nicht mehr so ganz. Ich hätte erwartet, dass zwischendurch schonmal eine Ausgabe der MySQL-Abfrage durchrutscht.

Ich habe darauf das Script nochmal leicht angepasst:


i = 0;
while (i < 1000) {
	pool.getConnection()
	.then(function(conn){
		i++;
		console.log("Durchlauf Nr. "+i);
		...

Wenn ich das Script jetzt ausführe, wird "Start" ausgegeben, einige Zeit passiert erstmal nichts mehr und dann bricht das Script mit einem "Javascript heap out of memory" ab.

Wieso läuft die Ausführung jetzt gar nicht mehr in die MySQL-Abfragen rein?

Ich stehe da wohl total auf dem Schlauch und hoffe, ihr könnt etwas Licht ins Dunkle bringen.

LG Klaus