Browse Source

Rollback to a more optimal Spring Boot application

The application now run within an executable JAR
and uses Spring Boot's defaults for configuration.

Benchmark setup code and configuration have been updated to reflect those changes.
Brian Clozel 11 years ago
parent
commit
e52173f793

+ 5 - 9
spring/README.md

@@ -7,13 +7,9 @@ This is using several [Spring projects](https://spring.io/projects) to build an
 ## How to run this app locally
 
 You can easily run this sample application with an embedded H2 database.
-For that, simply edit the [application.yml](src/main/resources/application.yml) and change the
-active profile from 'bench' to 'local'. You can also rename the
-[sample.sql file](src/main/resources/sample.sql) to 'import.sql'; sample data will be imported.
+For that, simply run:
 
-Then run:
-
-    mvn spring-boot:run
+    SPRING_PROFILES_ACTIVE=local mvn spring-boot:run
 
 ## Guides
 * [Building a REST service](https://spring.io/guides/gs/rest-service/)
@@ -66,7 +62,7 @@ Check out [SampleApplication, the main Application file](src/main/java/com/teche
 The tests were run with:
 
 * [Spring 4.0.0.RC1](http://projects.spring.io/spring-framework/)
-* [Spring Boot 0.5.0M5](http://projects.spring.io/spring-boot/)
-* [Spring Data JPA 1.4.1.RELEASE](http://projects.spring.io/spring-data-jpa/)
+* [Spring Boot 0.5.0M6](http://projects.spring.io/spring-boot/)
+* [Spring Data JPA 1.4.2.RELEASE](http://projects.spring.io/spring-data-jpa/)
 * [Java OpenJDK 1.7.0_09](http://openjdk.java.net/)
-* [Resin 4.0.34](http://www.caucho.com/)
+* [Tomcat 8.0.0-RC5](https://tomcat.apache.org/)

+ 1 - 1
spring/benchmark_config

@@ -17,7 +17,7 @@
       "language": "Java",
       "orm": "Full",
       "platform": "Servlet",
-      "webserver": "Resin",
+      "webserver": "Tomcat",
       "os": "Linux",
       "database_os": "Linux",
       "display_name": "spring",

+ 1 - 3
spring/pom.xml

@@ -8,18 +8,16 @@
     <parent>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-parent</artifactId>
-        <version>0.5.0.BUILD-SNAPSHOT</version>
+        <version>0.5.0.M6</version>
     </parent>
 
     <groupId>com.techempower</groupId>
     <artifactId>spring</artifactId>
     <version>1.0.0-SNAPSHOT</version>
-    <packaging>war</packaging>
     <name>Spring MVC sample project</name>
 
     <properties>
         <mysql.version>5.1.23</mysql.version>
-
         <jackson.version>2.1.1</jackson.version>
         <java.version>1.7</java.version>
         <spring.version>4.0.0.RC1</spring.version>

+ 11 - 20
spring/setup.py

@@ -4,29 +4,20 @@ import setup_util
 import os
 
 def start(args):
-  setup_util.replace_text("spring/src/main/webapp/WEB-INF/resin-web.xml", "mysql:\/\/.*:3306", "mysql://" + args.database_host + ":3306")
-
   try:
     subprocess.check_call("mvn clean package", shell=True, cwd="spring")
-
-    if os.name == 'nt':
-      subprocess.check_call('rmdir /S /Q "%RESIN_HOME%\\webapps\\"', shell=True)
-      subprocess.check_call('mkdir "%RESIN_HOME%\\webapps\\"', shell=True)
-      subprocess.check_call('copy spring\\target\\spring.war "%RESIN_HOME%\\webapps\\spring.war"', shell=True)
-      subprocess.check_call('"%RESIN_HOME%\\bin\\start.bat"', shell=True)
-    else:
-      subprocess.check_call("rm -rf $RESIN_HOME/webapps/*", shell=True)
-      subprocess.check_call("cp spring/target/spring.war $RESIN_HOME/webapps/spring.war", shell=True)
-      subprocess.check_call("$RESIN_HOME/bin/resinctl start", shell=True)
+    subprocess.Popen("java -Ddatabase.host=" + args.database_host + " -jar spring.jar".rsplit(" "), cwd="spring/target")
     return 0
   except subprocess.CalledProcessError:
     return 1
 def stop():
-  try:
-    if os.name == 'nt':
-      subprocess.check_call('"%RESIN_HOME%\\bin\\stop.bat"', shell=True)
-    else:
-      subprocess.check_call("$RESIN_HOME/bin/resinctl shutdown", shell=True)
-    return 0
-  except subprocess.CalledProcessError:
-    return 1
+  if os.name == 'nt':
+    subprocess.check_call("wmic process where \"CommandLine LIKE '%spring%'\" call terminate")
+  else:
+    p = subprocess.Popen(['ps', 'aux'], stdout=subprocess.PIPE)
+    out, err = p.communicate()
+    for line in out.splitlines():
+      if 'spring' in line:
+        pid = int(line.split(None, 2)[1])
+        os.kill(pid, 9)
+  return 0

+ 3 - 5
spring/source_code

@@ -1,14 +1,12 @@
-./spring/src/main/java/com/techempower/spring/config/BenchConfiguration.java
-./spring/src/main/java/com/techempower/spring/config/LocalConfiguration.java
 ./spring/src/main/java/com/techempower/spring/domain/Fortune.java
 ./spring/src/main/java/com/techempower/spring/domain/World.java
+./spring/src/main/java/com/techempower/spring/repository/FortuneRepository.java
+./spring/src/main/java/com/techempower/spring/repository/WorldRepository.java
 ./spring/src/main/java/com/techempower/spring/SampleApplication.java
-./spring/src/main/java/com/techempower/spring/service/FortuneRepository.java
-./spring/src/main/java/com/techempower/spring/service/WorldRepository.java
 ./spring/src/main/java/com/techempower/spring/web/FortuneController.java
 ./spring/src/main/java/com/techempower/spring/web/HelloController.java
 ./spring/src/main/java/com/techempower/spring/web/WorldDatabaseController.java
 ./spring/src/main/resources/application.yml
 ./spring/src/main/resources/logback.xml
+./spring/src/main/resources/schema.sql
 ./spring/src/main/resources/templates/fortunes.html
-./spring/src/main/webapp/WEB-INF/resin-web.xml

+ 4 - 20
spring/src/main/java/com/techempower/spring/SampleApplication.java

@@ -2,29 +2,13 @@ package com.techempower.spring;
 
 import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
 import org.springframework.boot.builder.SpringApplicationBuilder;
-import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
-import org.springframework.context.annotation.Profile;
-import org.springframework.jndi.JndiObjectFactoryBean;
-
-import javax.sql.DataSource;
 
 @ComponentScan
 @EnableAutoConfiguration
 public class SampleApplication {
 
-    public static void main(String[] args) throws Exception {
-        new SpringApplicationBuilder(SampleApplication.class).run(args);
-    }
-
-    @Profile("default")
-    @Bean
-    JndiObjectFactoryBean defaultDataSource() {
-        JndiObjectFactoryBean factoryBean = new JndiObjectFactoryBean();
-        factoryBean.setJndiName("java:jdbc/hello_world");
-        factoryBean.setExpectedType(DataSource.class);
-
-        return factoryBean;
-    }
-
-}
+	public static void main(String[] args) throws Exception {
+		new SpringApplicationBuilder(SampleApplication.class).run(args);
+	}
+}

+ 0 - 22
spring/src/main/java/com/techempower/spring/SampleApplicationInitializer.java

@@ -1,22 +0,0 @@
-package com.techempower.spring;
-
-import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
-
-public final class SampleApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
-
-    @Override
-    protected Class<?>[] getRootConfigClasses() {
-        return new Class[0];
-    }
-
-    @Override
-    protected Class<?>[] getServletConfigClasses() {
-        return new Class[]{SampleApplication.class};
-    }
-
-    @Override
-    protected String[] getServletMappings() {
-        return new String[]{"/"};
-    }
-
-}

+ 6 - 1
spring/src/main/resources/application.yml

@@ -2,6 +2,10 @@
 spring:
   datasource:
     initialize: false
+    driverClassName: com.mysql.jdbc.Driver
+    url: jdbc:mysql://${database.host:localhost}:3306/hello_world?jdbcCompliantTruncation=false&elideSetAutoCommits=true&useLocalSessionState=true&cachePrepStmts=true&cacheCallableStmts=true&alwaysSendSetIsolation=false&prepStmtCacheSize=4096&cacheServerConfiguration=true&prepStmtCacheSqlLimit=2048&zeroDateTimeBehavior=convertToNull&traceProtocol=false&useUnbufferedInput=false&useReadAheadInput=false&maintainTimeStats=false&useServerPrepStmts&cacheRSMetadata=true
+    username: benchmarkdbuser
+    password: benchmarkdbpass
   jpa:
     show_sql: false
 
@@ -9,4 +13,5 @@ spring:
 spring:
   profiles: local
   datasource:
-    initialize: false
+    driverClassName: org.h2.Driver
+    url: jdbc:h2:mem:framework_benchmark

+ 1 - 2
spring/src/main/resources/logback.xml

@@ -7,9 +7,8 @@
         </encoder>
     </appender>
 
-    <logger name="com.googlecode.flyway" level="INFO"/>
-    <logger name="com.nebhale.buildmonitor" level="${LOGGING_LEVEL:-INFO}"/>
     <logger name="org.apache" level="ERROR"/>
+    <logger name="org.springframework.boot.autoconfigure" level="INFO"/>
     <logger name="org.springframework.boot.actuate.endpoint.mvc.EndpointHandlerMapping" level="INFO"/>
     <logger name="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" level="INFO"/>
     <logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="INFO"/>

+ 0 - 0
spring/src/main/resources/import.sql → spring/src/main/resources/schema.sql