app.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster')
  5. , numCPUs = require('os').cpus().length
  6. , express = require('express')
  7. , Sequelize = require('sequelize')
  8. , mongoose = require('mongoose')
  9. , conn = mongoose.connect('mongodb://localhost/hello_world')
  10. , async = require('async');
  11. var Schema = mongoose.Schema
  12. , ObjectId = Schema.ObjectId;
  13. var WorldSchema = new mongoose.Schema({
  14. id : Number,
  15. randomNumber: Number
  16. }, {
  17. collection: 'world'
  18. }),
  19. MWorld = conn.model('World', WorldSchema);
  20. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  21. host: '127.0.0.1',
  22. dialect: 'mysql',
  23. logging: false,
  24. pool: {
  25. max: 5000,
  26. min: 0,
  27. idle: 5000
  28. }
  29. });
  30. var World = sequelize.define('World', {
  31. id: {
  32. type: 'Sequelize.INTEGER'
  33. },
  34. randomNumber: {
  35. type: 'Sequelize.INTEGER'
  36. }
  37. }, {
  38. timestamps: false,
  39. freezeTableName: true
  40. });
  41. var Fortune = sequelize.define('Fortune', {
  42. id: {
  43. type: 'Sequelize.INTEGER'
  44. },
  45. message: {
  46. type: 'Sequelize.STRING'
  47. }
  48. }, {
  49. timestamps: false,
  50. freezeTableName: true
  51. });
  52. if (cluster.isMaster) {
  53. // Fork workers.
  54. for (var i = 0; i < numCPUs; i++) {
  55. cluster.fork();
  56. }
  57. cluster.on('exit', function(worker, code, signal) {
  58. console.log('worker ' + worker.pid + ' died');
  59. });
  60. } else {
  61. var app = module.exports = express();
  62. // Configuration
  63. app.configure(function(){
  64. app.use(express.bodyParser());
  65. app.use(express.methodOverride());
  66. app.use(app.router);
  67. app.set('view engine', 'jade');
  68. app.set('views', __dirname + '/views');
  69. });
  70. app.configure('development', function() {
  71. app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  72. });
  73. app.configure('production', function() {
  74. app.use(express.errorHandler());
  75. });
  76. // Routes
  77. app.get('/json', function(req, res) {
  78. res.send({ message: 'Hello, World!' })
  79. });
  80. app.get('/mongoose', function(req, res) {
  81. var queries = req.query.queries || 1,
  82. queryFunctions = [];
  83. queries = Math.min(Math.max(queries, 1), 500);
  84. for (var i = 1; i <= queries; i++ ) {
  85. queryFunctions.push(function(callback) {
  86. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
  87. });
  88. }
  89. async.parallel(queryFunctions, function(err, results) {
  90. if (!req.query.queries) {
  91. results = results[0];
  92. }
  93. res.send(results);
  94. });
  95. });
  96. app.get('/mysql-orm', function(req, res) {
  97. var queries = isNaN(req.query.queries) ? 1 : parseInt(req.query.queries, 10)
  98. , queryFunctions = [];
  99. queries = Math.min(Math.max(queries, 1), 500);
  100. for (var i = 1; i <= queries; i++ ) {
  101. queryFunctions.push(function(callback) {
  102. World.findOne({
  103. where: {
  104. id: Math.floor(Math.random() * 10000) + 1}
  105. }
  106. ).complete(callback);
  107. });
  108. }
  109. async.parallel(queryFunctions, function(err, results) {
  110. if (!req.query.queries) {
  111. results = results[0];
  112. }
  113. res.send(results);
  114. });
  115. });
  116. app.get('/fortune', function(req, res) {
  117. if (windows) return res.send(501, 'Not supported on windows');
  118. Fortune.findAll().complete(function (err, fortunes) {
  119. var newFortune = {id: 0, message: "Additional fortune added at request time."};
  120. fortunes.push(newFortune);
  121. fortunes.sort(function (a, b) {
  122. return (a.message < b.message) ? -1 : 1;
  123. });
  124. res.render('fortunes', {fortunes: fortunes});
  125. });
  126. });
  127. app.get('/mongoose-update', function(req, res) {
  128. var queries = req.query.queries || 1
  129. , selectFunctions = [];
  130. queries = Math.min(queries, 500);
  131. for (var i = 1; i <= queries; i++ ) {
  132. selectFunctions.push(function(callback) {
  133. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  134. });
  135. }
  136. async.parallel(selectFunctions, function(err, worlds) {
  137. var updateFunctions = [];
  138. for (var i = 0; i < queries; i++) {
  139. (function(i){
  140. updateFunctions.push(function(callback){
  141. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  142. MWorld.update({
  143. id: worlds[i]
  144. }, {
  145. randomNumber: worlds[i].randomNumber
  146. }, callback);
  147. });
  148. })(i);
  149. }
  150. async.parallel(updateFunctions, function(err, updates) {
  151. res.send(worlds);
  152. });
  153. });
  154. });
  155. app.get('/mysql-orm-update', function(req, res) {
  156. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10)
  157. , selectFunctions = [];
  158. queries = Math.min(queries, 500);
  159. for (var i = 1; i <= queries; i++ ) {
  160. selectFunctions.push(function(callback) {
  161. World.findOne({
  162. where: {
  163. id: Math.floor(Math.random() * 10000) + 1}
  164. }
  165. ).complete(callback);
  166. });
  167. }
  168. async.parallel(selectFunctions, function(err, worlds) {
  169. var updateFunctions = [];
  170. for (var i = 0; i < queries; i++) {
  171. (function(i){
  172. updateFunctions.push(function(callback){
  173. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  174. worlds[i].save().complete(callback);
  175. });
  176. })(i);
  177. }
  178. async.parallel(updateFunctions, function(err, updates) {
  179. res.send(worlds);
  180. });
  181. });
  182. });
  183. app.listen(8080);
  184. }