Browse Source

[uWebsockets.js] Using bulk updates (#8346)

Imam Fahrur Rofi 2 years ago
parent
commit
66fcc29174

+ 3 - 1
frameworks/JavaScript/uwebsockets.js/src/database/postgres.js

@@ -12,4 +12,6 @@ export const fortunes = async () => await sql`SELECT id, message FROM fortune`;
 
 
 export const find = async (id) => await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then((arr) => arr[0]);
 export const find = async (id) => await sql`SELECT id, randomNumber FROM world WHERE id = ${id}`.then((arr) => arr[0]);
 
 
-export const update = async (obj) => await sql`UPDATE world SET randomNumber = ${obj.randomNumber} WHERE id = ${obj.id}`;
+export const bulkUpdate = async (worlds) => await sql`UPDATE world SET randomNumber = (update_data.randomNumber)::int
+  FROM (VALUES ${sql(worlds.map(world => [world.id, world.randomNumber]).sort((a, b) => (a[0] < b[0]) ? -1 : 1))}) AS update_data (id, randomNumber)
+  WHERE world.id = (update_data.id)::int`;

+ 8 - 13
frameworks/JavaScript/uwebsockets.js/src/server.js

@@ -14,19 +14,15 @@ if (DATABASE) db = await import(`./database/${DATABASE}.js`);
 const webserver = uWebSockets.App();
 const webserver = uWebSockets.App();
 
 
 webserver.get("/plaintext", (response) => {
 webserver.get("/plaintext", (response) => {
-  response.cork(() => {
-    addBenchmarkHeaders(response);
-    response.writeHeader("Content-Type", "text/plain");
-    response.end("Hello, World!");
-  });
+  addBenchmarkHeaders(response);
+  response.writeHeader("Content-Type", "text/plain");
+  response.end("Hello, World!");
 });
 });
 
 
 webserver.get("/json", (response) => {
 webserver.get("/json", (response) => {
-  response.cork(() => {
-    addBenchmarkHeaders(response);
-    response.writeHeader("Content-Type", "application/json");
-    response.end(JSON.stringify({ message: "Hello, World!" }));
-  });
+  addBenchmarkHeaders(response);
+  response.writeHeader("Content-Type", "application/json");
+  response.end(JSON.stringify({ message: "Hello, World!" }));
 });
 });
 
 
 if (db) {
 if (db) {
@@ -152,15 +148,14 @@ if (db) {
 
 
       for (let i = 0; i < queriesCount; i++) {
       for (let i = 0; i < queriesCount; i++) {
         worldObjects[i].randomNumber = generateRandomNumber();
         worldObjects[i].randomNumber = generateRandomNumber();
-        databaseJobs[i] = db.update(worldObjects[i]);
       }
       }
 
 
+      await db.bulkUpdate(worldObjects);
+
       if (response.aborted) {
       if (response.aborted) {
         return;
         return;
       }
       }
 
 
-      await Promise.all(databaseJobs);
-
       response.cork(() => {
       response.cork(() => {
         addBenchmarkHeaders(response);
         addBenchmarkHeaders(response);
         response.writeHeader("Content-Type", "application/json");
         response.writeHeader("Content-Type", "application/json");