hello.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  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 && world.value);
  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. res.writeHead(200, {
  75. 'Content-Type': 'application/json',
  76. 'Server': 'Node'
  77. });
  78. res.end(JSON.stringify(hello));
  79. break;
  80. case '/plaintext':
  81. // JSON Response Test
  82. res.writeHead(200, {'Content-Type': 'text/plain; charset=UTF-8'});
  83. // Write JSON object to response
  84. res.end(helloStr);
  85. break;
  86. case '/mongodbdriver':
  87. // Database Test
  88. var values = url.parse(req.url, true);
  89. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  90. var queryFunctions = new Array(queries);
  91. for (var i = 0; i < queries; i += 1) {
  92. queryFunctions[i] = mongodbDriverQuery;
  93. }
  94. async.parallel(queryFunctions, function(err, results) {
  95. if (!values.query.queries) {
  96. results = results[0];
  97. }
  98. res.writeHead(200, {
  99. 'Content-Type': 'application/json',
  100. 'Server': 'Node'
  101. });
  102. res.end(JSON.stringify(results));
  103. });
  104. break;
  105. case '/mongoose':
  106. // Database Test
  107. var values = url.parse(req.url, true);
  108. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  109. var queryFunctions = new Array(queries);
  110. for (var i = 0; i < queries; i += 1) {
  111. queryFunctions[i] = mongooseQuery;
  112. }
  113. async.parallel(queryFunctions, function(err, results) {
  114. if (!values.query.queries) {
  115. results = results[0];
  116. }
  117. res.writeHead(200, {
  118. 'Content-Type': 'application/json',
  119. 'Server': 'Node'
  120. });
  121. res.end(JSON.stringify(results));
  122. });
  123. break;
  124. case '/mysql-orm':
  125. var values = url.parse(req.url, true);
  126. var queries = Math.min(Math.max(values.query.queries, 1), 500);
  127. var queryFunctions = new Array(queries);
  128. for (var i = 0; i < queries; i += 1) {
  129. queryFunctions[i] = sequelizeQuery;
  130. }
  131. async.parallel(queryFunctions, function(err, results) {
  132. if (queries == 1) {
  133. results = results[0];
  134. }
  135. res.writeHead(200, {
  136. 'Content-Type': 'application/json',
  137. 'Server': 'Node'
  138. });
  139. res.end(JSON.stringify(results));
  140. });
  141. break;
  142. case '/mysql':
  143. function libmysqlQuery(callback) {
  144. libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
  145. if (err) {
  146. throw err;
  147. }
  148. res.fetchAll(function(err, rows) {
  149. if (err) {
  150. throw err;
  151. }
  152. res.freeSync();
  153. callback(null, rows[0]);
  154. });
  155. });
  156. }
  157. var values = url.parse(req.url, true);
  158. var queries = values.query.queries || 1;
  159. var queryFunctions = new Array(queries);
  160. for (var i = 0; i < queries; i += 1) {
  161. queryFunctions[i] = libmysqlQuery;
  162. }
  163. async.parallel(queryFunctions, function(err, results) {
  164. if (err) {
  165. res.writeHead(500);
  166. return res.end('MYSQL CONNECTION ERROR.');
  167. }
  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 '/update':
  179. function libmysqlQuery(callback) {
  180. libmysql.query("SELECT * FROM world WHERE id = " + getRandomNumber(), function (err, res) {
  181. if (err) {
  182. throw err;
  183. }
  184. res.fetchAll(function(err, rows) {
  185. if (err) {
  186. throw err;
  187. }
  188. res.freeSync();
  189. rows[0].randomNumber = getRandomNumber();
  190. libmysql.query("UPDATE World SET randomNumber = " + rows[0].randomNumber + " WHERE id = " + rows[0]['id'], function (err, res) {
  191. if (err) {
  192. throw err;
  193. }
  194. callback(null, rows[0]);
  195. });
  196. });
  197. });
  198. }
  199. var values = url.parse(req.url, true);
  200. var queries = values.query.queries || 1;
  201. if(queries < 1) {
  202. queries = 1;
  203. } else if(queries > 500) {
  204. queries = 500;
  205. }
  206. var queryFunctions = new Array(queries);
  207. for (var i = 0; i < queries; i += 1) {
  208. queryFunctions[i] = libmysqlQuery;
  209. }
  210. async.parallel(queryFunctions, function(err, results) {
  211. if (err) {
  212. res.writeHead(500);
  213. return res.end('MYSQL CONNECTION ERROR.');
  214. }
  215. res.writeHead(200, {
  216. 'Content-Type': 'application/json',
  217. 'Server': 'Node'
  218. });
  219. res.end(JSON.stringify(results));
  220. });
  221. break;
  222. case '/update-mongodb':
  223. // Database Test
  224. var values = url.parse(req.url, true);
  225. var queries = values.query.queries || 1;
  226. if (queries < 1) {
  227. queries = 1;
  228. } else if (queries > 500) {
  229. queries = 500;
  230. }
  231. var queryFunctions = new Array(queries);
  232. for (var i = 0; i < queries; i += 1) {
  233. queryFunctions[i] = mongodbDriverUpdateQuery;
  234. }
  235. async.parallel(queryFunctions, function(err, results) {
  236. res.writeHead(200, {
  237. 'Content-Type': 'application/json',
  238. 'Server': 'Node'
  239. });
  240. res.end(JSON.stringify(results));
  241. });
  242. break;
  243. default:
  244. // File not found handler
  245. res.writeHead(501, {'Content-Type': 'text/plain; charset=UTF-8'});
  246. res.end("NOT IMPLEMENTED");
  247. }
  248. }).listen(8080);