Skip to content

Commit 63dfbae

Browse files
committed
Add additional query benchmarks.
1 parent 573c36f commit 63dfbae

File tree

5 files changed

+127
-18
lines changed

5 files changed

+127
-18
lines changed

.idea/inspectionProfiles/Project_Default.xml

Lines changed: 4 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

benchmark.sh

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
BASE_URL=http://localhost:8080/httprpc-test-1.0/employees
2+
OUTPUT_FORMAT='%{time_starttransfer}, %{time_total}\n'
3+
4+
echo SQL
5+
curl $BASE_URL/sql -s -o /dev/null -w "$OUTPUT_FORMAT"
6+
7+
echo SQL Jackson
8+
curl $BASE_URL/sql-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"
9+
10+
echo SQL stream
11+
curl $BASE_URL/sql-stream -s -o /dev/null -w "$OUTPUT_FORMAT"
12+
13+
echo HQL
14+
curl $BASE_URL/hql -s -o /dev/null -w "$OUTPUT_FORMAT"
15+
16+
echo HQL Jackson
17+
curl $BASE_URL/hql-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"
18+
19+
echo HQL stream
20+
curl $BASE_URL/hql-stream -s -o /dev/null -w "$OUTPUT_FORMAT"
21+
22+
echo HQL stream/Jackson
23+
curl $BASE_URL/hql-stream-jackson -s -o /dev/null -w "$OUTPUT_FORMAT"

httprpc-test/src/main/java/org/httprpc/test/EmployeeService.java

Lines changed: 72 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@
2525
import javax.persistence.Table;
2626
import javax.servlet.ServletException;
2727
import javax.servlet.annotation.WebServlet;
28+
import javax.servlet.http.HttpServletRequest;
29+
import javax.servlet.http.HttpServletResponse;
2830
import javax.sql.DataSource;
2931
import java.io.IOException;
3032
import java.sql.Connection;
@@ -33,6 +35,7 @@
3335
import java.util.Date;
3436
import java.util.List;
3537
import java.util.Properties;
38+
import java.util.stream.Collectors;
3639
import java.util.stream.Stream;
3740

3841
@WebServlet(urlPatterns={"/employees/*"}, loadOnStartup=1)
@@ -48,7 +51,7 @@ public interface Employee {
4851

4952
@Entity
5053
@Table(name="employees")
51-
public static class EmployeeEntity {
54+
public static class EmployeeEntity implements Employee {
5255
@Id
5356
@Column(name = "emp_no")
5457
private int employeeNumber;
@@ -68,26 +71,32 @@ public static class EmployeeEntity {
6871
@Column(name = "hire_date")
6972
private Date hireDate;
7073

74+
@Override
7175
public int getEmployeeNumber() {
7276
return employeeNumber;
7377
}
7478

79+
@Override
7580
public String getFirstName() {
7681
return firstName;
7782
}
7883

84+
@Override
7985
public String getLastName() {
8086
return lastName;
8187
}
8288

89+
@Override
8390
public String getGender() {
8491
return gender;
8592
}
8693

94+
@Override
8795
public Date getBirthDate() {
8896
return birthDate;
8997
}
9098

99+
@Override
91100
public Date getHireDate() {
92101
return hireDate;
93102
}
@@ -97,16 +106,16 @@ public Date getHireDate() {
97106

98107
private SessionFactory sessionFactory = null;
99108

109+
private ThreadLocal<Boolean> useJackson = new ThreadLocal<>();
110+
100111
private static final String SQL_QUERY = QueryBuilder.select("emp_no AS employeeNumber",
101112
"first_name AS firstName",
102113
"last_name AS lastName",
103114
"gender",
104115
"birth_date AS birthDate",
105116
"hire_date AS hireDate").from("employees").toString();
106117

107-
private static final String HQL_QUERY = QueryBuilder.select("e").from("EmployeeEntity e").toString();
108-
109-
private static final int FETCH_SIZE = 2048;
118+
private static final String HQL_QUERY = QueryBuilder.select("e").from("EmployeeService$EmployeeEntity e").toString();
110119

111120
@Override
112121
public void init() throws ServletException {
@@ -131,25 +140,53 @@ public void init() throws ServletException {
131140
configuration.addAnnotatedClass(EmployeeEntity.class);
132141

133142
sessionFactory = configuration.buildSessionFactory();
143+
144+
useJackson.set(false);
145+
}
146+
147+
@Override
148+
public void destroy() {
149+
super.destroy();
150+
151+
if (sessionFactory != null) {
152+
sessionFactory.close();
153+
}
154+
}
155+
156+
@Override
157+
protected void encodeResult(HttpServletRequest request, HttpServletResponse response, Object result) throws IOException {
158+
if (useJackson.get()) {
159+
ObjectMapper objectMapper = new ObjectMapper();
160+
161+
objectMapper.enable(SerializationFeature.INDENT_OUTPUT);
162+
163+
objectMapper.writeValue(getResponse().getOutputStream(), result);
164+
} else {
165+
super.encodeResult(request, response, result);
166+
}
134167
}
135168

136169
@RequestMethod("GET")
137170
@ResourcePath("sql")
138-
public Iterable<Employee> getEmployees() throws SQLException {
171+
public List<Employee> getEmployees() throws SQLException {
139172
try (Connection connection = dataSource.getConnection();
140173
Statement statement = connection.createStatement();
141174
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery(SQL_QUERY))) {
142-
resultSetAdapter.setFetchSize(FETCH_SIZE);
143-
144-
return new StreamAdapter<>(resultSetAdapter.stream().map(result -> BeanAdapter.adapt(result, Employee.class)));
175+
return resultSetAdapter.stream()
176+
.map(result -> (Employee)BeanAdapter.adapt(result, Employee.class))
177+
.collect(Collectors.toList());
145178
}
146179
}
147180

148181
@RequestMethod("GET")
149-
@ResourcePath("hql")
150-
public List<EmployeeEntity> getEmployeesHibernate() {
151-
try (Session session = sessionFactory.openSession()) {
152-
return session.createQuery(HQL_QUERY, EmployeeEntity.class).list();
182+
@ResourcePath("sql-jackson")
183+
public List<Employee> getEmployeesJackson() throws SQLException {
184+
useJackson.set(true);
185+
186+
try {
187+
return getEmployees();
188+
} finally {
189+
useJackson.set(false);
153190
}
154191
}
155192

@@ -163,12 +200,30 @@ public void streamEmployees() throws SQLException, IOException {
163200
try (Connection connection = dataSource.getConnection();
164201
Statement statement = connection.createStatement();
165202
ResultSetAdapter resultSetAdapter = new ResultSetAdapter(statement.executeQuery(SQL_QUERY))) {
166-
resultSetAdapter.setFetchSize(FETCH_SIZE);
167-
168203
jsonEncoder.write(resultSetAdapter, getResponse().getOutputStream());
169204
}
170205
}
171206

207+
@RequestMethod("GET")
208+
@ResourcePath("hql")
209+
public List<? extends Employee> getEmployeesHibernate() {
210+
try (Session session = sessionFactory.openSession()) {
211+
return session.createQuery(HQL_QUERY, EmployeeEntity.class).list();
212+
}
213+
}
214+
215+
@RequestMethod("GET")
216+
@ResourcePath("hql-jackson")
217+
public List<? extends Employee> getEmployeesHibernateJackson() {
218+
useJackson.set(true);
219+
220+
try {
221+
return getEmployeesHibernate();
222+
} finally {
223+
useJackson.set(false);
224+
}
225+
}
226+
172227
@RequestMethod("GET")
173228
@ResourcePath("hql-stream")
174229
public void streamEmployeesHibernate() throws IOException {
@@ -177,7 +232,7 @@ public void streamEmployeesHibernate() throws IOException {
177232
JSONEncoder jsonEncoder = new JSONEncoder();
178233

179234
try (Session session = sessionFactory.openSession();
180-
StreamAdapter<EmployeeEntity> streamAdapter = new StreamAdapter<>(session.createQuery(HQL_QUERY, EmployeeEntity.class).stream())) {
235+
StreamAdapter<?> streamAdapter = new StreamAdapter<>(session.createQuery(HQL_QUERY, EmployeeEntity.class).stream().map(BeanAdapter::new))) {
181236
jsonEncoder.write(streamAdapter, getResponse().getOutputStream());
182237
}
183238
}
@@ -198,9 +253,9 @@ public void streamEmployeesHibernateJackson() throws IOException {
198253
SequenceWriter sequenceWriter = objectWriter.writeValues(getResponse().getOutputStream())) {
199254
sequenceWriter.init(true);
200255

201-
stream.forEach(employeeEntity -> {
256+
stream.forEach(employee -> {
202257
try {
203-
sequenceWriter.write(employeeEntity);
258+
sequenceWriter.write(employee);
204259
} catch (IOException exception) {
205260
throw new RuntimeException(exception);
206261
}

httprpc-test/src/main/webapp/index.jsp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,13 @@
201201
<a href="${pageContext.request.contextPath}/employees?api">Employees (API)</a><br/>
202202
<br/>
203203
<a href="${pageContext.request.contextPath}/employees/sql">Employees (SQL)</a><br/>
204-
<a href="${pageContext.request.contextPath}/employees/hql">Employees (HQL)</a><br/>
204+
<a href="${pageContext.request.contextPath}/employees/sql-jackson">Employees (SQL Jackson)</a><br/>
205205
<a href="${pageContext.request.contextPath}/employees/sql-stream">Employees (SQL stream)</a><br/>
206+
<br/>
207+
<a href="${pageContext.request.contextPath}/employees/hql">Employees (HQL)</a><br/>
208+
<a href="${pageContext.request.contextPath}/employees/hql-jackson">Employees (HQL Jackson)</a><br/>
206209
<a href="${pageContext.request.contextPath}/employees/hql-stream">Employees (HQL stream)</a><br/>
210+
<br/>
207211
<a href="${pageContext.request.contextPath}/employees/hql-stream-jackson">Employees (HQL stream Jackson)</a><br/>
208212

209213
</body>

pets.sql

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
drop schema if exists menagerie;
2+
3+
create schema menagerie;
4+
5+
use menagerie;
6+
7+
create table pet (
8+
name varchar(20),
9+
owner varchar(20),
10+
species varchar(20),
11+
sex char(1),
12+
birth date,
13+
death date
14+
);
15+
16+
insert into pet (name, owner, species, sex, birth, death) values ('Fluffy', 'Harold', 'cat', 'f', '1993-02-04', null);
17+
insert into pet (name, owner, species, sex, birth, death) values ('Claws', 'Gwen', 'cat', 'm', '1994-03-17', null);
18+
insert into pet (name, owner, species, sex, birth, death) values ('Buffy', 'Harold', 'dog', 'f', '1989-05-13', null);
19+
insert into pet (name, owner, species, sex, birth, death) values ('Fang', 'Benny', 'dog', 'm', '1990-08-27', null);
20+
insert into pet (name, owner, species, sex, birth, death) values ('Bowser', 'Diane', 'dog', 'm', '1979-08-31', '1995-07-29');
21+
insert into pet (name, owner, species, sex, birth, death) values ('Chirpy', 'Gwen', 'bird', 'f', '1998-09-11', null);
22+
insert into pet (name, owner, species, sex, birth, death) values ('Whistler', 'Gwen', 'bird', null, '1997-12-09', null);
23+
insert into pet (name, owner, species, sex, birth, death) values ('Slim', 'Benny', 'snake', 'm', '1996-04-29', null);

0 commit comments

Comments
 (0)