hello.js 7.3 KB

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