app.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. /**
  2. * Module dependencies.
  3. */
  4. var cluster = require('cluster'),
  5. numCPUs = require('os').cpus().length,
  6. Hapi = require('hapi'),
  7. Sequelize = require('sequelize'),
  8. mongoose = require('mongoose'),
  9. conn = mongoose.connect('mongodb://localhost/hello_world'),
  10. async = require('async');
  11. var WorldSchema = new mongoose.Schema({
  12. id : Number,
  13. randomNumber: Number
  14. }, {
  15. collection: 'world'
  16. }),
  17. MWorld = conn.model('World', WorldSchema);
  18. var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
  19. host: 'localhost',
  20. dialect: 'mysql',
  21. logging: false
  22. });
  23. var World = sequelize.define('World', {
  24. id: {
  25. type: 'Sequelize.INTEGER'
  26. },
  27. randomNumber: {
  28. type: 'Sequelize.INTEGER'
  29. }
  30. }, {
  31. timestamps: false,
  32. freezeTableName: true
  33. });
  34. var Fortune = sequelize.define('Fortune', {
  35. id: {
  36. type: 'Sequelize.INTEGER'
  37. },
  38. message: {
  39. type: 'Sequelize.STRING'
  40. }
  41. }, {
  42. timestamps: false,
  43. freezeTableName: true
  44. });
  45. if (cluster.isMaster) {
  46. // Fork workers.
  47. for (var i = 0; i < numCPUs; i++) {
  48. cluster.fork();
  49. }
  50. cluster.on('exit', function(worker, code, signal) {
  51. console.log('worker ' + worker.pid + ' died');
  52. });
  53. } else {
  54. var server = module.exports = new Hapi.Server();
  55. server.connection({port: 8080});
  56. server.views({
  57. engines: {
  58. html: require('handlebars')
  59. },
  60. path: __dirname + '/views'
  61. });
  62. server.route({
  63. method: 'GET',
  64. path: '/json',
  65. handler: function(req, reply) {
  66. reply({ message: 'Hello, World!' }).header('Server', 'hapi');
  67. }
  68. });
  69. server.route({
  70. method: 'GET',
  71. path: '/plaintext',
  72. handler: function(req, reply) {
  73. reply('Hello, World!')
  74. .header('Server', 'hapi')
  75. .header('Content-Type', 'text/plain');
  76. }
  77. });
  78. server.route({
  79. method: 'GET',
  80. path: '/mongoose/{queries?}',
  81. handler: function(req, reply){
  82. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  83. queryFunctions = [];
  84. queries = Math.min(Math.max(queries, 1), 500);
  85. for (var i = 1; i <= queries; i++) {
  86. queryFunctions.push(function(callback){
  87. MWorld.findOne({ id: (Math.floor(Math.random() * 10000) + 1) }).exec(callback);
  88. });
  89. }
  90. async.parallel(queryFunctions, function(err, results){
  91. if (!req.params.queries) {
  92. results = results[0];
  93. }
  94. reply(results).header('Server', 'hapi');
  95. });
  96. }
  97. });
  98. server.route({
  99. method: 'GET',
  100. path: '/mysql-orm/{queries?}',
  101. handler: function(req, reply){
  102. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  103. queryFunctions = [];
  104. queries = Math.min(Math.max(queries, 1), 500);
  105. for (var i = 1; i <= queries; i++) {
  106. queryFunctions.push(function(callback){
  107. World.findOne({
  108. where: {
  109. id: Math.floor(Math.random() * 10000) + 1}
  110. }
  111. ).complete(callback);
  112. });
  113. }
  114. async.parallel(queryFunctions, function(err, results){
  115. if (!req.params.queries) {
  116. results = results[0];
  117. }
  118. reply(results).header('Server', 'hapi');
  119. });
  120. }
  121. });
  122. server.route({
  123. method: 'GET',
  124. path: '/fortune',
  125. handler: function(req,reply){
  126. Fortune.findAll().complete(function(err, fortunes){
  127. fortunes.push({
  128. id: 0,
  129. message: 'Additional fortune added at request time.'
  130. });
  131. fortunes.sort(function(a, b){
  132. return (a.message < b.message) ? -1 : 1;
  133. });
  134. reply.view('fortunes', {
  135. fortunes: fortunes
  136. }).header('Server', 'hapi');
  137. });
  138. }
  139. });
  140. server.route({
  141. method: 'GET',
  142. path: '/mongoose-update/{queries?}',
  143. handler: function(req, reply){
  144. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  145. selectFunctions = [];
  146. queries = Math.max(Math.min(queries, 500), 1);
  147. for (var i = 1; i <= queries; i++) {
  148. selectFunctions.push(function(callback){
  149. MWorld.findOne({ id: Math.floor(Math.random() * 10000) + 1 }).exec(callback);
  150. });
  151. }
  152. async.parallel(selectFunctions, function(err, worlds) {
  153. var updateFunctions = [];
  154. for (var i = 0; i < queries; i++) {
  155. (function(i){
  156. updateFunctions.push(function(callback){
  157. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  158. MWorld.update({
  159. id: worlds[i]
  160. }, {
  161. randomNumber: worlds[i].randomNumber
  162. }, callback);
  163. });
  164. })(i);
  165. }
  166. async.parallel(updateFunctions, function(err, updates) {
  167. reply(worlds).header('Server', 'hapi');
  168. });
  169. });
  170. }
  171. });
  172. server.route({
  173. method: 'GET',
  174. path: '/mysql-orm-update/{queries?}',
  175. handler: function(req,reply){
  176. var queries = isNaN(req.params.queries) ? 1 : parseInt(req.params.queries, 10),
  177. selectFunctions = [];
  178. queries = Math.max(Math.min(queries, 500), 1);
  179. for (var i = 1; i <= queries; i++) {
  180. selectFunctions.push(function(callback){
  181. World.findOne({
  182. where: {
  183. id: Math.floor(Math.random() * 10000) + 1}
  184. }
  185. ).complete(callback);
  186. });
  187. }
  188. async.parallel(selectFunctions, function(err, worlds) {
  189. var updateFunctions = [];
  190. for (var i = 0; i < queries; i++) {
  191. (function(i){
  192. updateFunctions.push(function(callback){
  193. worlds[i].randomNumber = Math.ceil(Math.random() * 10000);
  194. worlds[i].save().complete(callback);
  195. });
  196. })(i);
  197. }
  198. async.parallel(updateFunctions, function(err, updates) {
  199. reply(worlds).header('Server', 'hapi');
  200. });
  201. });
  202. }
  203. });
  204. server.start();
  205. }