Skip to content

Commit a65f24a

Browse files
wizzardomichaelhixson
authored andcommitted
updated wizzardo-http dependencies and implementation (#3785)
* updated dependency * updated dependency and improved db-handlers * cleanup * cleanup
1 parent 8b9d091 commit a65f24a

File tree

4 files changed

+137
-53
lines changed

4 files changed

+137
-53
lines changed

frameworks/Java/wizzardo-http/build.gradle

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ repositories {
1414
}
1515

1616
dependencies {
17-
compile 'com.wizzardo:http:0.2.1'
17+
compile 'com.wizzardo:http:0.2.2'
18+
1819
compile 'org.postgresql:postgresql:9.4.1212'
1920
compile 'com.zaxxer:HikariCP:2.7.3'
2021
}

frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/App.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,16 @@ protected void initHttpPartsCache() {
3131
};
3232

3333
webApplication.onSetup(app -> {
34-
app.getUrlMapping()
35-
.append("/plaintext", (request, response) -> response.setBody(HELLO_WORLD)
36-
.appendHeader(Header.KV_CONTENT_TYPE_TEXT_PLAIN))
37-
.append("/json", (request, response) -> response
38-
.setBody(JsonTools.serializeToBytes(new Message("Hello, World!")))
39-
.appendHeader(Header.KV_CONTENT_TYPE_APPLICATION_JSON))
40-
.append("/db", DBController.class, "world")
41-
.append("/queries", DBController.class, "queries")
42-
.append("/updates", DBController.class, "updates");
34+
app.getUrlMapping()
35+
.append("/plaintext", (request, response) -> response.setBody(HELLO_WORLD)
36+
.appendHeader(Header.KV_CONTENT_TYPE_TEXT_PLAIN))
37+
.append("/json", (request, response) -> response
38+
.setBody(JsonTools.serializeToBytes(new Message("Hello, World!")))
39+
.appendHeader(Header.KV_CONTENT_TYPE_APPLICATION_JSON))
40+
.append("/db", DBController.class, "world")
41+
.append("/queries", DBController.class, "queries")
42+
.append("/updates", DBController.class, "updates")
43+
;
4344
}
4445
);
4546

frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/DBController.java

Lines changed: 110 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,31 @@
11
package com.wizzardo.techempower;
22

3+
import com.wizzardo.epoll.ByteBufferProvider;
4+
import com.wizzardo.epoll.ByteBufferWrapper;
5+
import com.wizzardo.http.HttpConnection;
36
import com.wizzardo.http.framework.Controller;
4-
import com.wizzardo.http.framework.parameters.Parameter;
57
import com.wizzardo.http.framework.template.Renderer;
68
import com.wizzardo.http.request.Header;
9+
import com.wizzardo.http.response.Status;
10+
import com.wizzardo.tools.json.JsonTools;
711

8-
import java.nio.charset.StandardCharsets;
9-
import java.sql.Connection;
10-
import java.sql.PreparedStatement;
11-
import java.sql.ResultSet;
12-
import java.sql.SQLException;
13-
import java.util.ArrayList;
14-
import java.util.Collections;
15-
import java.util.List;
12+
import java.sql.*;
13+
import java.util.Arrays;
14+
import java.util.concurrent.ExecutorService;
15+
import java.util.concurrent.Executors;
1616
import java.util.concurrent.ThreadLocalRandom;
17+
import java.util.concurrent.atomic.AtomicBoolean;
18+
import java.util.concurrent.atomic.AtomicInteger;
1719

1820
public class DBController extends Controller {
1921

2022
DBService dbService;
23+
static ThreadLocal<ByteBufferProvider> byteBufferProviderThreadLocal = ThreadLocal.<ByteBufferProvider>withInitial(() -> {
24+
ByteBufferWrapper wrapper = new ByteBufferWrapper(64 * 1024);
25+
return () -> wrapper;
26+
});
27+
28+
static ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
2129

2230
public Renderer world() throws SQLException {
2331
World world;
@@ -36,52 +44,112 @@ public Renderer world() throws SQLException {
3644
return renderJson(world);
3745
}
3846

39-
public Renderer queries() throws SQLException {
47+
public void queries() {
4048
int queries = Math.min(Math.max(params().getInt("queries", 1), 1), 500);
49+
response.async();
50+
AtomicInteger counter = new AtomicInteger(0);
51+
AtomicBoolean failed = new AtomicBoolean(false);
4152

4253
World[] worlds = new World[queries];
43-
try (Connection connection = dbService.getConnection();
44-
PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")
45-
) {
46-
for (int i = 0; i < worlds.length; i++) {
47-
statement.setInt(1, getRandomNumber());
48-
try (ResultSet resultSet = statement.executeQuery()) {
49-
resultSet.next();
50-
int id = resultSet.getInt(1);
51-
int randomNumber = resultSet.getInt(2);
52-
worlds[i] = new World(id, randomNumber);
53-
}
54-
}
55-
}
56-
57-
return renderJson(worlds);
58-
}
54+
for (int i = 0; i < queries; i++) {
55+
int index = i;
5956

60-
public Renderer updates() throws SQLException {
61-
int queries = Math.min(Math.max(params().getInt("queries", 1), 1), 500);
62-
World[] worlds = new World[queries];
63-
try (Connection connection = dbService.getConnection()) {
64-
try (PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")) {
65-
for (int i = 0; i < worlds.length; i++) {
57+
executorService.submit(() -> {
58+
try (Connection connection = dbService.getConnection();
59+
PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")
60+
) {
6661
statement.setInt(1, getRandomNumber());
6762
try (ResultSet resultSet = statement.executeQuery()) {
6863
resultSet.next();
6964
int id = resultSet.getInt(1);
7065
int randomNumber = resultSet.getInt(2);
71-
worlds[i] = new World(id, randomNumber);
66+
worlds[index] = new World(id, randomNumber);
67+
}
68+
} catch (SQLException e) {
69+
if (failed.compareAndSet(false, true)) {
70+
response.status(Status._500).body(e.getMessage());
71+
commitAsyncResponse();
7272
}
73+
return;
7374
}
74-
}
75-
try (PreparedStatement statement = connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?")) {
76-
for (World world : worlds) {
77-
world.randomNumber = getRandomNumber();
78-
statement.setInt(1, world.randomNumber);
79-
statement.setInt(2, world.id);
80-
statement.executeUpdate();
75+
76+
if (counter.incrementAndGet() == queries && !failed.get()) {
77+
response.appendHeader(Header.KV_CONTENT_TYPE_APPLICATION_JSON);
78+
response.body(JsonTools.serializeToBytes(worlds));
79+
80+
commitAsyncResponse();
8181
}
82-
}
82+
});
8383
}
84-
return renderJson(worlds);
84+
}
85+
86+
public void updates() {
87+
int queries = Math.min(Math.max(params().getInt("queries", 1), 1), 500);
88+
response.async();
89+
AtomicInteger counter = new AtomicInteger(0);
90+
AtomicBoolean failed = new AtomicBoolean(false);
91+
92+
World[] worlds = new World[queries];
93+
for (int i = 0; i < queries; i++) {
94+
int index = i;
95+
executorService.submit(() -> {
96+
try (Connection connection = dbService.getConnection()) {
97+
try (PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")) {
98+
statement.setInt(1, getRandomNumber());
99+
try (ResultSet resultSet = statement.executeQuery()) {
100+
resultSet.next();
101+
int id = resultSet.getInt(1);
102+
int randomNumber = resultSet.getInt(2);
103+
worlds[index] = new World(id, randomNumber);
104+
}
105+
}
106+
} catch (Exception e) {
107+
if (failed.compareAndSet(false, true)) {
108+
response.status(Status._500).body(e.getMessage());
109+
commitAsyncResponse();
110+
}
111+
}
112+
113+
114+
if (counter.incrementAndGet() == queries && !failed.get()) {
115+
executorService.submit(() -> {
116+
try (Connection connection = dbService.getConnection()) {
117+
try (PreparedStatement statement = connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?")) {
118+
Arrays.sort(worlds, (o1, o2) -> Integer.compare(o2.id, o1.id));
119+
for (int j = queries - 1; j >= 0; j--) {
120+
World world = worlds[j];
121+
world.randomNumber = getRandomNumber();
122+
statement.setInt(1, world.randomNumber);
123+
statement.setInt(2, world.id);
124+
if (j > 0)
125+
statement.addBatch();
126+
else
127+
statement.executeBatch();
128+
}
129+
}
130+
131+
response.appendHeader(Header.KV_CONTENT_TYPE_APPLICATION_JSON);
132+
response.body(JsonTools.serializeToBytes(worlds));
133+
134+
commitAsyncResponse();
135+
} catch (Exception e) {
136+
if (failed.compareAndSet(false, true)) {
137+
response.status(Status._500).body(e.getMessage());
138+
commitAsyncResponse();
139+
}
140+
}
141+
});
142+
}
143+
});
144+
}
145+
}
146+
147+
protected void commitAsyncResponse() {
148+
ByteBufferProvider bufferProvider = byteBufferProviderThreadLocal.get();
149+
HttpConnection connection = request.connection();
150+
response.commit(connection, bufferProvider);
151+
connection.flush(bufferProvider);
152+
response.reset();
85153
}
86154

87155
protected int getRandomNumber() {

frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/DBService.java

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.wizzardo.http.framework.Configuration;
44
import com.wizzardo.http.framework.di.PostConstruct;
55
import com.wizzardo.http.framework.di.Service;
6+
67
import com.zaxxer.hikari.HikariConfig;
78
import com.zaxxer.hikari.HikariDataSource;
89
import org.postgresql.ds.PGSimpleDataSource;
@@ -13,8 +14,8 @@
1314

1415
public class DBService implements Service, PostConstruct {
1516

16-
protected DataSource dataSource;
1717
protected DBConfig config;
18+
protected DataSource dataSource;
1819

1920
@Override
2021
public void init() {
@@ -59,5 +60,18 @@ public DBConfig() {
5960
public String prefix() {
6061
return "db";
6162
}
63+
64+
@Override
65+
public String toString() {
66+
return "DBConfig{" +
67+
"dbname='" + dbname + '\'' +
68+
", host='" + host + '\'' +
69+
", port=" + port +
70+
", username='" + username + '\'' +
71+
", password='" + password + '\'' +
72+
", maximumPoolSize=" + maximumPoolSize +
73+
", minimumIdle=" + minimumIdle +
74+
'}';
75+
}
6276
}
6377
}

0 commit comments

Comments
 (0)