hello.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster')
  5. , numCPUs = require('os').cpus().length
  6. , http = require('http')
  7. , url = require('url')
  8. , Sequelize = require('sequelize')
  9. , mysql = require('mysql')
  10. , async = require('async')
  11. , mongoose = require('mongoose')
  12. , conn = mongoose.connect('mongodb://localhost/hello_world')
  13. , MongoClient = require('mongodb').MongoClient;
  14. // MongoDB Raw Setup
  15. var collection = null;
  16. MongoClient.connect('mongodb://localhost/hello_world?maxPoolSize=5', function(err, db) {
  17. collection = db.collection('world');
  18. });
  19. // MySQL Raw Setup
  20. var connection = mysql.createConnection({
  21. host : 'localhost',
  22. user : 'benchmarkdbuser',
  23. password : 'benchmarkdbpass',
  24. database : 'hello_world'
  25. });
  26. connection.connect();
  27. // Mongoose Setup
  28. var WorldSchema = new mongoose.Schema({
  29. id : Number,
  30. randomNumber: Number
  31. }, {
  32. collection: 'world'
  33. }),
  34. MWorld = conn.model('World', WorldSchema);
  35. // Sequelize Setup
  36. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  37. host: 'localhost',
  38. dialect: 'mysql',
  39. logging: false
  40. });
  41. var World = sequelize.define('World', {
  42. id: {
  43. type: 'Sequelize.INTEGER'
  44. },
  45. randomNumber: {
  46. type: 'Sequelize.INTEGER'
  47. }
  48. }, {
  49. timestamps: false,
  50. freezeTableName: true
  51. });
  52. var Fortune = sequelize.define('Fortune', {
  53. id: {
  54. type: 'Sequelize.INTEGER'
  55. },
  56. message: {
  57. type: 'Sequelize.STRING'
  58. }
  59. }, {
  60. timestamps: false,
  61. freezeTableName: true
  62. });
  63. // Helper functions
  64. function getRandomNumber() {
  65. return Math.floor(Math.random() * 10000) + 1;
  66. }
  67. // Mongoose Query Functions
  68. function mongooseQuery(callback) {
  69. MWorld.findOne({
  70. id: getRandomNumber()
  71. }).exec(function (err, world) {
  72. callback(err, world);
  73. });
  74. }
  75. // MongoDB-Raw Query Functions
  76. function mongodbDriverQuery(callback) {
  77. collection.findOne({
  78. id: getRandomNumber()
  79. }, function(err, world) {
  80. world._id = undefined; // remove _id from query response
  81. callback(err, world);
  82. });
  83. }
  84. function mongodbDriverUpdateQuery(callback) {
  85. collection.findAndModify({
  86. id: getRandomNumber()
  87. }, [['_id','asc']], {
  88. $set: {randomNumber: getRandomNumber()}
  89. }, {}, function(err, world) {
  90. world.value._id = undefined; // remove _id from query response
  91. callback(err, world.value);
  92. });
  93. }
  94. // Sequelize Query Functions
  95. function sequelizeQuery(callback) {
  96. World.findOne({
  97. where: {
  98. id: Math.floor(Math.random() * 10000) + 1}
  99. }
  100. ).complete(callback);
  101. }
  102. // MySQL-Raw Query Functions
  103. function mysqlQuery(callback) {
  104. connection.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, rows, fields) {
  105. if (err) {
  106. throw err;
  107. }
  108. callback(null, rows[0]);
  109. });
  110. }
  111. function mysqlUpdateQuery(callback) {
  112. connection.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, rows, fields) {
  113. if (err) {
  114. throw err;
  115. }
  116. rows[0].randomNumber = getRandomNumber();
  117. var updateQuery = "UPDATE world SET randomNumber = " + rows[0].randomNumber + " WHERE id = " + rows[0]['id'];
  118. connection.query(updateQuery, function (err, result) {
  119. if (err) {
  120. throw err;
  121. }
  122. callback(null, rows[0]);
  123. });
  124. });
  125. }
  126. if(cluster.isMaster) {
  127. // Fork workers.
  128. for (var i = 0; i < numCPUs; i++) {
  129. cluster.fork();
  130. }
  131. cluster.on('exit', function(worker, code, signal) {
  132. console.log('worker ' + worker.pid + ' died');
  133. });
  134. return;
  135. } else {
  136. http.createServer(function (req, res) {
  137. // JSON response object
  138. var hello = {message: "Hello, World!"};
  139. var helloStr = "Hello, World!";
  140. var path = url.parse(req.url).pathname;
  141. switch (req.url) {
  142. case '/json':
  143. res.writeHead(200, {
  144. 'Content-Type': 'application/json',
  145. 'Server': 'Node'
  146. });
  147. res.end(JSON.stringify(hello));
  148. break;
  149. case '/plaintext':
  150. res.writeHead(200, {
  151. 'Content-Type': 'text/plain; charset=UTF-8',
  152. 'Server': 'Node'
  153. });
  154. res.end(helloStr);
  155. break;
  156. }
  157. var values = url.parse(req.url, true);
  158. var queries = isNaN(values.query.queries) ? 1 : parseInt(values.query.queries, 10);
  159. queries = Math.min(Math.max(queries, 1), 500);
  160. switch (values.pathname) {
  161. // Raw MongoDB Routes
  162. case '/mongodb':
  163. var queryFunctions = [];
  164. for (var i = 0; i < queries; i += 1) {
  165. queryFunctions.push(mongodbDriverQuery);
  166. }
  167. async.parallel(queryFunctions, function(err, results) {
  168. if (!values.query.queries) {
  169. results = results[0];
  170. }
  171. res.writeHead(200, {
  172. 'Content-Type': 'application/json',
  173. 'Server': 'Node'
  174. });
  175. res.end(JSON.stringify(results));
  176. });
  177. break;
  178. case '/mongodb-update':
  179. var queryFunctions = [];
  180. for (var i = 0; i < queries; i += 1) {
  181. queryFunctions.push(mongodbDriverUpdateQuery);
  182. }
  183. async.parallel(queryFunctions, function(err, results) {
  184. res.writeHead(200, {
  185. 'Content-Type': 'application/json',
  186. 'Server': 'Node'
  187. });
  188. res.end(JSON.stringify(results));
  189. });
  190. break;
  191. // Mongoose ORM Routes
  192. case '/mongoose':
  193. var queryFunctions = [];
  194. for (var i = 0; i < queries; i += 1) {
  195. queryFunctions.push(mongooseQuery);
  196. }
  197. async.parallel(queryFunctions, function(err, results) {
  198. if (!values.query.queries) {
  199. results = results[0];
  200. }
  201. res.writeHead(200, {
  202. 'Content-Type': 'application/json',
  203. 'Server': 'Node'
  204. });
  205. res.end(JSON.stringify(results));
  206. });
  207. break;
  208. case '/mongoose-update':
  209. var selectFunctions = [];
  210. for (var i = 0; i < queries; i += 1) {
  211. selectFunctions.push(mongooseQuery);
  212. }
  213. async.parallel(selectFunctions, function(err, worlds) {
  214. var updateFunctions = [];
  215. for (var i = 0; i < queries; i++) {
  216. (function(i){
  217. updateFunctions.push(function(callback){
  218. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  219. MWorld.update({
  220. id: worlds[i]
  221. }, {
  222. randomNumber: worlds[i].randomNumber
  223. }, callback);
  224. });
  225. })(i);
  226. }
  227. async.parallel(updateFunctions, function(err, updates) {
  228. res.writeHead(200, {
  229. 'Content-Type': 'application/json',
  230. 'Server': 'Node'
  231. });
  232. res.end(JSON.stringify(worlds));
  233. });
  234. });
  235. break;
  236. // Sequelize (MySQL ORM) Routes
  237. case '/mysql-orm':
  238. var queryFunctions = [];
  239. for (var i = 0; i < queries; i += 1) {
  240. queryFunctions.push(sequelizeQuery);
  241. }
  242. async.parallel(queryFunctions, function(err, results) {
  243. if (!values.query.queries) {
  244. results = results[0];
  245. }
  246. res.writeHead(200, {
  247. 'Content-Type': 'application/json',
  248. 'Server': 'Node'
  249. });
  250. res.end(JSON.stringify(results));
  251. });
  252. break;
  253. case '/mysql-orm-update':
  254. var selectFunctions = [];
  255. for (var i = 0; i < queries; i += 1) {
  256. selectFunctions.push(sequelizeQuery);
  257. }
  258. async.parallel(selectFunctions, function(err, worlds) {
  259. var updateFunctions = [];
  260. for (var i = 0; i < queries; i++) {
  261. (function(i){
  262. updateFunctions.push(function(callback){
  263. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  264. worlds[i].save().complete(callback);
  265. });
  266. })(i);
  267. }
  268. async.parallel(updateFunctions, function(err, updates) {
  269. res.writeHead(200, {
  270. 'Content-Type': 'application/json',
  271. 'Server': 'Node'
  272. });
  273. res.end(JSON.stringify(worlds));
  274. });
  275. });
  276. break;
  277. // Raw MongoDB Routes
  278. case '/mysql':
  279. var queryFunctions = [];
  280. for (var i = 0; i < queries; i += 1) {
  281. queryFunctions.push(mysqlQuery);
  282. }
  283. async.parallel(queryFunctions, function(err, results) {
  284. if (!values.query.queries) {
  285. results = results[0];
  286. }
  287. res.writeHead(200, {
  288. 'Content-Type': 'application/json',
  289. 'Server': 'Node'
  290. });
  291. res.end(JSON.stringify(results));
  292. });
  293. break;
  294. case '/mysql-update':
  295. var queryFunctions = [];
  296. for (var i = 0; i < queries; i += 1) {
  297. queryFunctions.push(mysqlUpdateQuery);
  298. }
  299. async.parallel(queryFunctions, function(err, results) {
  300. res.writeHead(200, {
  301. 'Content-Type': 'application/json',
  302. 'Server': 'Node'
  303. });
  304. res.end(JSON.stringify(results));
  305. });
  306. break;
  307. default:
  308. // File not found handler
  309. res.writeHead(501, {'Content-Type': 'text/plain; charset=UTF-8'});
  310. res.end("NOT IMPLEMENTED");
  311. }
  312. }).listen(8080);
  313. }