node-mssql์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. "node-mssql์ ์ฟผ๋ฆฌ์์ ์ค์ ๋ก ๋์ ์คํ๋์ง ์์ต๋๋ค."
๋ฌธ์ : https://github.com/patriksimek/node-mssql/issues/217
์งง์ ์ค๋ช : ์ง๋ฃจํ ์คํธ๋ฆผ ํ์๊ฐ ๋ค๋ฅธ ์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๋ ๊ฒ์ _might_ ์ฐจ๋จํ๊ธฐ ๋๋ฌธ์ ์คํธ๋ฆผ์ด ํ์ฑํ๋ ์ฌ๋ฌ ์ฟผ๋ฆฌ๊ฐ ๋์์ ์คํ๋์ง ์์ต๋๋ค.
StreamParser.prototype._transform = function (input, encoding, done) {
var job, length, offset, result;
offset = 0;
this.buffer.append(input);
if (!this.generator) {
this.generator = this.parser();
this.currentStep = this.generator.next();
}
job = void 0;
result = void 0;
length = void 0;
while (!this.currentStep.done) {
job = this.currentStep.value;
if (!(job instanceof Job)) {
return done(new Error('invalid job type'));
}
length = job.length;
if (this.buffer.length - offset < length) {
break;
}
result = job.execute(this.buffer, offset);
offset += length;
this.currentStep = this.generator.next(result);
}
this.buffer.consume(offset);
if (this.currentStep.done) {
this.push(null);
}
return done();
};
Visual Studio Code๋ก ํ๋ก๊ทธ๋จ์ ๋๋ฒ๊น ํ๊ณ ์๋๋ฐ ์คํธ๋ฆผ ํ์ ๋ด๋ถ์ while ๋ฃจํ ํํธ๊ฐ ๋ค๋ฅธ ์ฟผ๋ฆฌ๊ฐ ์ฒ๋ฆฌ๋๊ฑฐ๋ ํ์ ๋ฐํํ์ง ๋ชปํ๋๋ก ์ฐจ๋จํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฌ๋ฌ ๋์ ์ฐ๊ฒฐ์ด ์ด๋ ค ์์ ๋ StreamParser๊ฐ ์ฒ๋ฆฌ๋๋ ๋ฐฉ๋ฒ์ ๋ํด ์๋ ค์ฃผ์ค ์ ์์ต๋๊น?
@arthurschreiber
@patriksimek
์๋ ํ์ธ์ @XemsDoom
๊ทํ์ ๋ฌธ์ ์ค๋ช
์ ์ฝ์์ผ๋ฉฐ ๊ทํ์ ๋ฌธ์ ๊ฐ tedious
์๋ ๋ฐฉ์์ ์๋์ง ์๋๋ฉด ์ผ๋ฐ์ ์ผ๋ก Node.JS์ ์๋์ง ๊ถ๊ธํฉ๋๋ค. Node.js๋ ๋จ์ผ ์ค๋ ๋ ์ด๋ฒคํธ ๊ธฐ๋ฐ ํ๊ฒฝ์ด๋ฏ๋ก CPU์์ ๋ฐ์ํ๋ ๋ชจ๋ ์ข
๋ฅ์ ์ฒ๋ฆฌ๋ ํญ์ ๋ค๋ฅธ CPU ์ฒ๋ฆฌ ์์
์ ์ฐจ๋จํฉ๋๋ค.
tedious
์ ์คํธ๋ฆผ ๊ตฌ๋ฌธ ๋ถ์ ์ฝ๋์ ๊ด๋ จํ์ฌ: ๋ค์ด์ค๋ ๋ฐ์ดํฐ์ ๊ตฌ๋ฌธ ๋ถ์์ "๋น๋๊ธฐ์ ์ผ๋ก ๋๊ธฐ"์
๋๋ค. ์ด๊ฒ์ ์คํธ๋ฆผ ํ์์ (๋น๋๊ธฐ์ ์ผ๋ก) ํธ์๋ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐ์ ์ผ๋ก ํ์ฑ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๋ฐ๋ผ์ ์คํธ๋ฆผ์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ํ ํด๋น ๋ฐ์ดํฐ๋ ๊ตฌ๋ฌธ ๋ถ์๋๋ฉฐ ์ด๋ ์ฐจ๋จ ๋๊ธฐ ์์
์
๋๋ค.
๋๋ ๊ตฌ๋ฌธ ๋ถ์์ "๋น๋๊ธฐ์์ผ๋ก ๋น๋๊ธฐ์"์ผ๋ก ๋ง๋๋ ์์
์ ํด์์ง๋ง tedious
์ ๊ธฐ์กด ๋ด๋ถ๋ ๊ธฐ์กด ๋์์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
์ด์ ๋ฒ์ ์ ์ง๋ฃจํ(์: 1.11.5
)์ ์ฌ์ฉํด ๋ณด๊ณ ๋ฌธ์ ๊ฐ ์ด๋ฏธ ์กด์ฌํ๋์ง ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๊ฒ์ ๋ถ๋ช
ํ ๋ด ๋ชฉ๋ก์ ์์ง๋ง ์ง๊ธ ๋น์ฅ์ ๊ทธ๋ค์ง ์ฐ์ ์์๊ฐ ๋์ง ์์ต๋๋ค.
๊ตฌํ ์๋ฒค๋ @arthurschreiber. ๋๋ NodeJS๊ฐ ์ด๋ป๊ฒ ์๋ํ๋์ง ์๊ณ ์๊ณ CPU ์ง์ฝ์ ์ธ JS ์ฝ๋๋ ๋ชจ๋ ๊ฒ์ด ๋จ์ผ ์ค๋ ๋์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ๋ชจ๋ ์ฒ๋ฆฌ๋ฅผ ์ฐจ๋จํ ๊ฒ์ ๋๋ค.
์ ์๊ฐ์๋ ์ง๋ฃจํ๊ฑฐ๋ ์๋ชป๋ ๋์์ธ ๊ฒฐ์ ์ ๋ฒ๊ทธ๊ฐ ์์ต๋๋ค. ์๋ํ๋ฉด ์ง๊ธ์ฒ๋ผ ์๋ํ์ง ์์์ผ ํ๋ค๊ณ ํ์ ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๋ฌ ์คํธ๋ฆฌ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ์ ๋ฉ๋๋ค. "์์ฐจ์ ์ผ๋ก"๋ ์ด์ ์ฟผ๋ฆฌ๊ฐ ์๋ฃ๋ ํ ์ฒ๋ฆฌ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ฏธํฉ๋๋ค.
ํ๋์ ์ฟผ๋ฆฌ์ ๋ง์ ํ์ด ์๋ ๊ฒฝ์ฐ(์: 100k ๋ฐ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ 50k ํ), ๋ฐ์ดํฐ๋ฒ ์ด์ค ์๋ฒ์์ ํ์ ๊ฐ์ ธ์ฌ ๋ ์ฟผ๋ฆฌ๊ฐ ์ฝํ ์๋ ์คํธ๋ฆผ ํ์์ ์ํด ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
์์? ๋ค๋ฅธ ์น ์์ฒญ์ด ๋ ๊ฐ์ ๋ค๋ฅธ ํ ์ด๋ธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฒ์ํ๋ ค๋ ๊ฒฝ์ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ก ์ธํด ํ ์ฌ์ฉ์๊ฐ ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ด ๋์์ธ์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์น ์๋ฒ์ ๋์ผํ ๋๋ ๋ง๋ฅผ ๊ฒช๊ณ ์์ต๋๋ค.
๋ ์ผ์ด๋ก ์ค๋ช ํ๋ ค๊ณ ํ๋ ์ดํด๊ฐ ๋ ์ฌ์ธ ๊ฒ ๊ฐ์์ :)
์ง๋ฃจํ Bearbeitet nur eine Query zu einem gegebenen Zeitpunkt, statt alle ausgefรผhrten Queries gemeinsam _nebenlรคufig_ im Stream Parser zu bearbeiten, momentan werden die anderen Queries nicht bearbeitet also Query bisd die ersteerste bzw. Werden diese somit sequenziell abgearbeitet.
Ergo, fรผhrst du 3 Queries aus und hast 3 Callbacks fรผr wenn Rows gefetcht wurden, werden die 2 weiteren ์ฝ๋ฐฑ erst aufgerufen, wenn die erste Query durch ist, obwohl eigentlich durch das Streaming dievers Mit _Miteinander_ meine ich, dass alle 3 Callbacks jeweils in einer offensichtlich nicht geordneten Abfolge gerufen werden.
๋ํ zum Beispiel์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฟผ๋ฆฌ 1, ์ฟผ๋ฆฌ 2, ์ฟผ๋ฆฌ 3 werden nebenlรคufig ausgefรผhrt. mssql์ ์ฐ๊ฒฐ ํ์์ ๊ณ ์ ํ ์ฐ๊ฒฐ์ ์ฟผ๋ฆฌํ์ญ์์ค.
Nun sollten die Rows von allen 3 Queries eigentlich gleichzeitig zurรผck kommen:
ํ ์ฟผ๋ฆฌ1, ํ ์ฟผ๋ฆฌ1, ํ ์ฟผ๋ฆฌ3, ํ ์ฟผ๋ฆฌ2, ํ ์ฟผ๋ฆฌ3, ํ ์ฟผ๋ฆฌ2, ํ ์ฟผ๋ฆฌ2....
๊ฒฐ์ ์ฌํญ์ ๊ฒฐ์ ์ฌํญ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค.
์ง๋ฃจํ aber fรผhrt das ganze so aus:
row-query1, row-query1, row-query1.....bis stop fertig....dann row-query2, row-query2, row-query2....bis wieder fertig....dann row-query3 , ํ ์ฟผ๋ฆฌ3, ํ ์ฟผ๋ฆฌ3....
๋๋ฌด ํ๋ณตํ์ต๋๋ค. dass hat ja nichts damit zu tun, dass NodeJS single-threaded ist, sondern dass der Parser nicht verschiedene Queries _konkurrierend_ bearbeitet.
์๋ ํ์ธ์ @XemsDoom
์์ธํ ์ค๋ช (๋ฐ ๋ ์ผ์ด ๋ฒ์ญ - ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ฐ๋ฆฌ๊ฐ ๋งํ๋ ๋ด์ฉ์ ์ดํดํ ์ ์๋๋ก ์์ด๋ก ๋ต๋ณํ๊ฒ ์ต๋๋ค)์ ๊ฐ์ฌ๋๋ฆฝ๋๋ค. :์๋ค:
์์์ ์ค๋ช
ํ๋ฏ์ด ์ด๊ฒ์ ํ์ฌ ์ง๋ฃจํ ๊ฒ์ผ๋ก ์๋ ค์ ธ ์์ง๋ง ๋ฌธ์ํ๋์ง ์์ ์ ํ ์ฌํญ์ด๋ฉฐ 1.12
๋ฆด๋ฆฌ์ค ๋ผ์ธ๊ณผ ์์ฑ๊ธฐ๋ก์ ์ ํ์์ ๋์
ํ ๋ถํํ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์์ ํ ํ ์ด๋ฅผ ์์ ํ๊ธฐ ์ํด ์์
ํ ๊ณํ์
๋๋ค.
๋๋ ํ์ฑ์ด ์ฝํ ์๋๋ก ๋ณ๊ฒฝํ๋ ๋ก์ปฌ ๋ถ๊ธฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง ํ์ฌ ํ๋์ ์ด๋ฒคํธ ๋ฃจํ ํด์์ ํน์ ์์๋ก ๋ฐ์ํ๋ ์ด๋ฒคํธ์ ์์กดํ๋ ๋ค๋ฅธ ์ง๋ฃจํ ๋ด๋ถ๋ฅผ ๊นจ๋จ๋ฆฝ๋๋ค. ์ด ๋ชจ๋ ๊ฒ์ ๊ณ ์น ์ ์์ง๋ง 1.12
๋ฆด๋ฆฌ์ค์์ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ค์๋ฅผ ํ๊ณ ์ถ์ง ์๊ธฐ ๋๋ฌธ์ ์๊ฐ๊ณผ ์ฒ ์ ํ ํ
์คํธ๊ฐ ํ์ํฉ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ ๋กญ๊ฒ ๋ ธ๋ ฅํ๋ผ๊ณ ๋งํ๊ณ ์ถ์ง๋ง ์ฑ๋ฅ ํฅ์์ ์ํ ํฅํ ๋ณ๊ฒฝ ์ฌํญ์ ํ ํฐ ๊ตฌ๋ฌธ ๋ถ์ ์ฝ๋๋ฅผ ๋ง์ด ๋ณ๊ฒฝํ ๊ฒ์ด๋ฉฐ ์๊ฐ์ ๋ญ๋นํ๊ณ ์ถ์ง ์์ต๋๋ค. :์ค๋งํ_์์ฌ:
๊ณ ๋ง์ ์์. ๋น์ ์ ์ด๋ฏธ ์ด ๋ฌธ์ ๋ฅผ ์๊ณ ์๋ ๊ฒ ๊ฐ์ผ๋ฉฐ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ํด ๋ ธ๋ ฅํ๊ณ ์๋ค๋ ๊ฒ์ ๊ฐ์ฌํฉ๋๋ค. ๋ฌธ์ ๊ฐ ์ธ์ ์์ ๋์๋์ง ํ์ธํ ์ ์๋๋ก ์ด ๋ฌธ์ ๋ฅผ ๊ณต๊ฐํ ์ ์์ต๋๊น? ์ด๋ค ์์ผ๋ก๋ ๋์์ด ๋ ์ ์๋ค๋ฉด ๋ง์ํด ์ฃผ์ธ์. ๊ธฐ๊บผ์ด ๋์๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ข์ ์ ๋ ๋์ธ์.
@arthurschreiber ์ด ์์ ์ ์ํํ๊ณ ์์ต๋๊น? "์์ ์ค"์ด๋ผ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ณด๊ณ ๋ ์ง 1๋ ๋ฐ์ด ์ง๋ฌ์ต๋๋ค.
๋ํ ์ด ๋ฌธ์ ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ก ์์ ํ๋ ํ์ฅ์ฑ ๋น์ฆ๋์ค ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ ์์ด ์์ฅ์ ๋ฐฉํดํ๋ ์์์ด๊ธฐ ๋๋ฌธ์ ์ด ์ฃผ์ ์ ๋ํด ์งํ ์ํฉ์ด ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
query()๊ฐ ๋ชจ๋ ์์ฒญ์ ์ฐจ๋จํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฑ์ด ์๋ก์ด ์์ฒญ์ ์๋ฝํ ์ ์์ผ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ ๋๋น ์ง๋๋ค.
์ฌ๊ธฐ์ ์ง์ ์ด ์๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฌธ์ ์ธ์ฌ,
๋จ์ ์ด๋ฆ
์๋ ํ์ธ์ @arthurschreiber ,
์คํธ๋ฆผ์ด ์๋ฃ๋ ๋๊น์ง ์คํธ๋ฆผ์ด ์ ์ฒด nodeJS ์ฑ์ ์ฐจ๋จํ๋ ๊ฒ๊ณผ ๋์ผํ(์ ์๊ฐ์๋?) ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ณ ์์ง๋ง @luca-moser๊ฐ ์์ ์ธ์ฉํ ๋๋ก ์ํฅ์ ๋ฐ๋ ์ฝ๋ ๋ธ๋ก์ ์ฐพ๋ ๋ฐ ์ด๋ ค์์ ๊ฒช๊ณ ์์ต๋๋ค. ๋ด ํน์ ์ฌ์ฉ ์ฌ๋ก์ ๋ง๊ฒ ์์ ํ ์ ์๋์ง ํ์ธํ๊ณ ์ถ์ผ๋ฏ๋ก ์ฌ๋ฐ๋ฅธ ๋ฐฉํฅ์ผ๋ก ์ ๋ฅผ ๊ฐ๋ฆฌ์ผ ์ฃผ์๊ฒ ์ต๋๊น? ๋น๋๊ธฐ์ ๋น๋๊ธฐ ์๋ฃจ์ ์ ํ ์คํธํ๋ ๋ก์ปฌ ๋ถ๊ธฐ๊ฐ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. ์ด ๋ฌธ์ ์ ์ด๋ก ์ธํด ๋ฐ์ํ๋ ์๋ ค์ง ๋ฌธ์ ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๊น? ๊ฐ์ฌ ํด์!
์ฌ๋ณด์ธ์. ๋๋ ๊ณค๋ํด. ๋๋ ์คํธ๋ฆผ์ ์ฌ์ฉํ์ฌ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ป๊ณ ์น ์์ผ์ ์ฌ์ฉํ์ฌ ํ๋ฐํธ ์๋์์ ๋ณด๋ ๋๋ค. ๋ชจ๋ ์ ์๋ํ์ง๋ง ์คํธ๋ฆฌ๋ฐํ๋ ๋์ ์ง๋ฃจํ ๊ฒ์ด ์ฌ์ ํ ์ฐจ๋จ๋ฉ๋๋ค. ์์์ด ์๋์? non-blocking ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น?
๊ฐ์ฌ ํด์
5๋ ๋ฐ์ด ์ง๋ฌ์ง๋ง ์คํธ๋ฆผ์ ๋น๋๊ธฐ ๋๊ธฐ ๋์์ ์ฌ์ ํ โโ์์ ๋์ง ์์์ต๋๋ค. :-(
@bluefire2121 https://github.com/tediousjs/tedious/pull/1240 ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. 5๋ ๋ฐ ํ. ๐ฌ
๋ฐฉ๊ธ [email protected]
๋ฅผ tedious@next
๋ฆด๋ฆฌ์ค ์ฑ๋์ ๋ฆด๋ฆฌ์คํ์ต๋๋ค. ์ฌ๊ธฐ์์ ์ค๋ช
ํ๋ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋๋ฉด ๋ต๋ณ์ ๋๋ฆฌ๊ฒ ์ต๋๋ค.
๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ผ๋ฉด ์ผ์ฃผ์ผ ํ์ ์๋์ผ๋ก tedious@latest
๋ฆด๋ฆฌ์ค ์ฑ๋๋ก ์น๊ฒฉ๋ฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋ํ ์ด ๋ฌธ์ ๋ ๋์ฉ๋ ๋ฐ์ดํฐ๋ก ์์ ํ๋ ํ์ฅ์ฑ ๋น์ฆ๋์ค ์์ฉ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ ๋ฐ ์์ด ์์ฅ์ ๋ฐฉํดํ๋ ์์์ด๊ธฐ ๋๋ฌธ์ ์ด ์ฃผ์ ์ ๋ํด ์งํ ์ํฉ์ด ์๋์ง ์๊ณ ์ถ์ต๋๋ค.
query()๊ฐ ๋ชจ๋ ์์ฒญ์ ์ฐจ๋จํ๊ธฐ ๋๋ฌธ์ ์ ์ฒด ์ฑ์ด ์๋ก์ด ์์ฒญ์ ์๋ฝํ ์ ์์ผ๋ฉด ์ฌ์ฉ์ ๊ฒฝํ์ด ๋ ๋๋น ์ง๋๋ค.
์ฌ๊ธฐ์ ์ง์ ์ด ์๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ฌธ์ ์ธ์ฌ,
๋จ์ ์ด๋ฆ