hello.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  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. , async = require('async')
  10. , mongoose = require('mongoose')
  11. , conn = mongoose.connect('mongodb://localhost/hello_world')
  12. , MongoClient = require('mongodb').MongoClient;
  13. var collection = null;
  14. MongoClient.connect('mongodb://localhost/hello_world?maxPoolSize=5', function(err, db) {
  15. collection = db.collection('world');
  16. });
  17. var WorldSchema = new mongoose.Schema({
  18. id : Number,
  19. randomNumber: Number
  20. }, {
  21. collection: 'world'
  22. }),
  23. MWorld = conn.model('World', WorldSchema);
  24. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  25. host: 'localhost',
  26. dialect: 'mysql',
  27. logging: false,
  28. pool: {
  29. max: 5000,
  30. min: 0,
  31. idle: 5000
  32. }
  33. });
  34. var World = sequelize.define('World', {
  35. id: {
  36. type: 'Sequelize.INTEGER'
  37. },
  38. randomNumber: {
  39. type: 'Sequelize.INTEGER'
  40. }
  41. }, {
  42. timestamps: false,
  43. freezeTableName: true
  44. });
  45. var Fortune = sequelize.define('Fortune', {
  46. id: {
  47. type: 'Sequelize.INTEGER'
  48. },
  49. message: {
  50. type: 'Sequelize.STRING'
  51. }
  52. }, {
  53. timestamps: false,
  54. freezeTableName: true
  55. });
  56. // Helper functions
  57. function getRandomNumber() {
  58. return Math.floor(Math.random() * 10000) + 1;
  59. }
  60. function mongooseQuery(callback) {
  61. MWorld.findOne({ id: getRandomNumber()}).exec(function (err, world) {
  62. callback(err, world);
  63. });
  64. }
  65. function mongodbDriverQuery(callback) {
  66. collection.findOne({ id: getRandomNumber()}, function(err, world) {
  67. callback(err, world);
  68. });
  69. }
  70. function mongodbDriverUpdateQuery(callback) {
  71. collection.findAndModify({ id: getRandomNumber()}, [['_id','asc']], {$set: {randomNumber: getRandomNumber()}}, {}, function(err, world) {
  72. callback(err, world && world.value);
  73. });
  74. }
  75. function sequelizeQuery(callback) {
  76. World.findById(getRandomNumber(), function (err, world) {
  77. callback(null, world);
  78. });
  79. }
  80. if(cluster.isMaster) {
  81. // Fork workers.
  82. for (var i = 0; i < numCPUs; i++) {
  83. cluster.fork();
  84. }
  85. cluster.on('exit', function(worker, code, signal) {
  86. console.log('worker ' + worker.pid + ' died');
  87. });
  88. return;
  89. } else {
  90. http.createServer(function (req, res) {
  91. // JSON response object
  92. var hello = {message: "Hello, World!"};
  93. var helloStr = "Hello, World!";
  94. var path = url.parse(req.url).pathname;
  95. switch (path) {
  96. case '/json':
  97. res.writeHead(200, {
  98. 'Content-Type': 'application/json',
  99. 'Server': 'Node'
  100. });
  101. res.end(JSON.stringify(hello));
  102. break;
  103. case '/plaintext':
  104. // JSON Response Test
  105. res.writeHead(200, {'Content-Type': 'text/plain; charset=UTF-8'});
  106. // Write JSON object to response
  107. res.end(helloStr);
  108. break;
  109. case '/mongodbdriver':
  110. // Database Test
  111. var values = url.parse(req.url, true);
  112. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  113. var queryFunctions = new Array(queries);
  114. for (var i = 0; i < queries; i += 1) {
  115. queryFunctions[i] = mongodbDriverQuery;
  116. }
  117. async.parallel(queryFunctions, function(err, results) {
  118. if (!values.query.queries) {
  119. results = results[0];
  120. }
  121. res.writeHead(200, {
  122. 'Content-Type': 'application/json',
  123. 'Server': 'Node'
  124. });
  125. res.end(JSON.stringify(results));
  126. });
  127. break;
  128. case '/mongoose':
  129. // Database Test
  130. var values = url.parse(req.url, true);
  131. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  132. var queryFunctions = new Array(queries);
  133. for (var i = 0; i < queries; i += 1) {
  134. queryFunctions[i] = mongooseQuery;
  135. }
  136. async.parallel(queryFunctions, function(err, results) {
  137. if (!values.query.queries) {
  138. results = results[0];
  139. }
  140. res.writeHead(200, {
  141. 'Content-Type': 'application/json',
  142. 'Server': 'Node'
  143. });
  144. res.end(JSON.stringify(results));
  145. });
  146. break;
  147. case '/mysql-orm':
  148. var values = url.parse(req.url, true);
  149. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  150. var queryFunctions = new Array(queries);
  151. for (var i = 0; i < queries; i += 1) {
  152. queryFunctions[i] = sequelizeQuery;
  153. }
  154. async.parallel(queryFunctions, function(err, results) {
  155. if (queries == 1) {
  156. results = results[0];
  157. }
  158. res.writeHead(200, {
  159. 'Content-Type': 'application/json',
  160. 'Server': 'Node'
  161. });
  162. res.end(JSON.stringify(results));
  163. });
  164. break;
  165. case '/mysql':
  166. function libmysqlQuery(callback) {
  167. libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
  168. if (err) {
  169. throw err;
  170. }
  171. res.fetchAll(function(err, rows) {
  172. if (err) {
  173. throw err;
  174. }
  175. res.freeSync();
  176. callback(null, rows[0]);
  177. });
  178. });
  179. }
  180. var values = url.parse(req.url, true);
  181. var queries = values.query.queries || 1;
  182. var queryFunctions = new Array(queries);
  183. for (var i = 0; i < queries; i += 1) {
  184. queryFunctions[i] = libmysqlQuery;
  185. }
  186. async.parallel(queryFunctions, function(err, results) {
  187. if (err) {
  188. res.writeHead(500);
  189. return res.end('MYSQL CONNECTION ERROR.');
  190. }
  191. if (!values.query.queries) {
  192. results = results[0];
  193. }
  194. res.writeHead(200, {
  195. 'Content-Type': 'application/json',
  196. 'Server': 'Node'
  197. });
  198. res.end(JSON.stringify(results));
  199. });
  200. break;
  201. case '/update':
  202. function libmysqlQuery(callback) {
  203. libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
  204. if (err) {
  205. throw err;
  206. }
  207. res.fetchAll(function(err, rows) {
  208. if (err) {
  209. throw err;
  210. }
  211. res.freeSync();
  212. rows[0].randomNumber = getRandomNumber();
  213. libmysql.query("UPDATE World SET randomNumber = " + rows[0].randomNumber + " WHERE id = " + rows[0]['id'], function (err, res) {
  214. if (err) {
  215. throw err;
  216. }
  217. callback(null, rows[0]);
  218. });
  219. });
  220. });
  221. }
  222. var values = url.parse(req.url, true);
  223. var queries = values.query.queries || 1;
  224. if(queries < 1) {
  225. queries = 1;
  226. } else if(queries > 500) {
  227. queries = 500;
  228. }
  229. var queryFunctions = new Array(queries);
  230. for (var i = 0; i < queries; i += 1) {
  231. queryFunctions[i] = libmysqlQuery;
  232. }
  233. async.parallel(queryFunctions, function(err, results) {
  234. if (err) {
  235. res.writeHead(500);
  236. return res.end('MYSQL CONNECTION ERROR.');
  237. }
  238. res.writeHead(200, {
  239. 'Content-Type': 'application/json',
  240. 'Server': 'Node'
  241. });
  242. res.end(JSON.stringify(results));
  243. });
  244. break;
  245. case '/update-mongodb':
  246. // Database Test
  247. var values = url.parse(req.url, true);
  248. var queries = values.query.queries || 1;
  249. if (queries < 1) {
  250. queries = 1;
  251. } else if (queries > 500) {
  252. queries = 500;
  253. }
  254. var queryFunctions = new Array(queries);
  255. for (var i = 0; i < queries; i += 1) {
  256. queryFunctions[i] = mongodbDriverUpdateQuery;
  257. }
  258. async.parallel(queryFunctions, function(err, results) {
  259. res.writeHead(200, {
  260. 'Content-Type': 'application/json',
  261. 'Server': 'Node'
  262. });
  263. res.end(JSON.stringify(results));
  264. });
  265. break;
  266. default:
  267. // File not found handler
  268. res.writeHead(501, {'Content-Type': 'text/plain; charset=UTF-8'});
  269. res.end("NOT IMPLEMENTED");
  270. }
  271. }).listen(8080);
  272. }