Skip to content

Commit 30e27d7

Browse files
greenlaw110NateBrady23
authored andcommitted
[ci fw-only Java/act] Optimize SQL datasource configuration; Add act-jdbc tests (db tests with raw jdbc access) (#2709)
* make beetlsql dbservice share the datasource with pgsql dbservice * add act-jdbc tests; optimize datasource configuration * rename test set name in benchmark_config.json
1 parent 3d5f6c3 commit 30e27d7

File tree

7 files changed

+209
-41
lines changed

7 files changed

+209
-41
lines changed

frameworks/Java/act/README.md

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
This is the ActFramework portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
44

5-
This is using [ActFramework R1.0.2](http://actframework.org) to build an application.
5+
This is using [ActFramework R1.1.2](http://actframework.org) to build an application.
66

77
## How to run this app locally
88

@@ -16,7 +16,7 @@ unzip *.zip
1616
./start
1717
```
1818

19-
Or simply run `run.sh`
19+
Or simply run `./run.sh`
2020

2121

2222
## Application Endpoints
@@ -30,24 +30,32 @@ Or simply run `run.sh`
3030
* `mongo`: http://localhost:8080/mongo/db
3131
* `mysql`: http://localhost:8080/mysql/db
3232
* `pgsql`: http://localhost:8080/pgsql/db
33+
* `beetlsql-pgsql`: http://localhost:8080/beetsql/db
34+
* `jdbc-pgsql`: http://localhost:8080/beetsql/db
3335

3436
### Multiple queries
3537

3638
* `mongo`: http://localhost:8080/mongo/queries?quries=20
3739
* `mysql`: http://localhost:8080/mysql/queries?quries=20
3840
* `pgsql`: http://localhost:8080/pgsql/queries?quries=20
41+
* `beetlsql-pgsql`: http://localhost:8080/beetsql/queries?quries=20
42+
* `jdbc-pgsql`: http://localhost:8080/beetsql/queries?quries=20
3943

4044
### Fortunes
4145

4246
* `mongo`: http://localhost:8080/mongo/fortunes
4347
* `mysql`: http://localhost:8080/mysql/fortunes
4448
* `pgsql`: http://localhost:8080/pgsql/fortunes
49+
* `beetlsql-pgsql`: http://localhost:8080/beetsql/db
50+
* `jdbc-pgsql`: http://localhost:8080/beetsql/db
4551

4652
### DB updates
4753

4854
* `mongo`: http://localhost:8080/mongo/updates?quries=20
4955
* `mysql`: http://localhost:8080/mysql/updates?quries=20
5056
* `pgsql`: http://localhost:8080/pgsql/updates?quries=20
57+
* `beetlsql-pgsql`: http://localhost:8080/beetsql/updates?quries=20
58+
* `jdbc-pgsql`: http://localhost:8080/beetsql/updates?quries=20
5159

5260
### Plain text
5361

@@ -132,17 +140,20 @@ The common base classes for mysql and pgsql classes
132140
* [World controller](src/main/java/com/techempower/act/pgsql/controller/WorldController.java) - for `/pgsql/db`, `/pgsql/queries` and `/pgsql/updates` endpoint
133141

134142

135-
136143
## Infrastructure Software Versions
137144
The tests were run with:
138145

139-
* [ActFramework 1.0.4](http://actframework.org/)
140-
* [act-ebean plugin 1.0.3](https://github.com/actframework/act-ebean)
141-
* [act-morphia plugin 1.0.2](https://github.com/actframework/act-morphia)
146+
* [ActFramework 1.1.2](http://actframework.org/)
147+
* [act-ebean2 plugin 1.04](https://github.com/actframework/act-ebean2)
148+
* [act-morphia plugin 1.1.0](https://github.com/actframework/act-morphia)
149+
* [act-beetlsql plugin 1.1.0](https://github.com/actframework/act-beetlsql)
150+
* [act-mustache plugin 1.0.0](https://github.com/actframework/act-mustache)
142151
* [Undertow 1.4.8.Final](http://undertow.io/)
143152

144153
## Local Test Result
145154

155+
**Note** the data below is outdated
156+
146157
| Test | Throughput | Latency | Timeout/Error |
147158
| -------------------------- | ---------: | --------: | ------: |
148159
| json | 1026530.41 | 3.31ms | |

frameworks/Java/act/benchmark_config.json

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"notes": "",
2222
"versus": "undertow"
2323
},
24-
"pgsql": {
24+
"ebean-pg": {
2525
"setup_file": "setup",
2626
"db_url": "/pgsql/db",
2727
"query_url": "/pgsql/queries?queries=",
@@ -43,7 +43,7 @@
4343
"notes": "",
4444
"versus": "undertow"
4545
},
46-
"mysql": {
46+
"ebean-my": {
4747
"setup_file": "setup",
4848
"db_url": "/mysql/db",
4949
"query_url": "/mysql/queries?queries=",
@@ -65,7 +65,7 @@
6565
"notes": "",
6666
"versus": "undertow"
6767
},
68-
"mongodb": {
68+
"morphia-mo": {
6969
"setup_file": "setup",
7070
"db_url": "/mongo/db",
7171
"query_url": "/mongo/queries?queries=",
@@ -87,7 +87,7 @@
8787
"notes": "",
8888
"versus": "undertow"
8989
},
90-
"beetlsql": {
90+
"beetlsql-pg": {
9191
"setup_file": "setup",
9292
"db_url": "/beetlsql/db",
9393
"query_url": "/beetlsql/queries?queries=",
@@ -105,7 +105,29 @@
105105
"webserver": "None",
106106
"os": "Linux",
107107
"database_os": "Linux",
108-
"display_name": "act-beetlsql",
108+
"display_name": "act-beetlsql-pgsql",
109+
"notes": "",
110+
"versus": "undertow"
111+
},
112+
"jdbc-pg": {
113+
"setup_file": "setup",
114+
"db_url": "/jdbc/db",
115+
"query_url": "/jdbc/queries?queries=",
116+
"fortune_url": "/jdbc/fortunes",
117+
"update_url": "/jdbc/updates?queries=",
118+
"port": 8080,
119+
"approach": "Realistic",
120+
"classification": "Fullstack",
121+
"database": "Postgres",
122+
"framework": "actframework",
123+
"language": "Java",
124+
"flavor": "None",
125+
"orm": "Raw",
126+
"platform": "Undertow",
127+
"webserver": "None",
128+
"os": "Linux",
129+
"database_os": "Linux",
130+
"display_name": "act-jdbc-pgsql",
109131
"notes": "",
110132
"versus": "undertow"
111133
}

frameworks/Java/act/src/main/java/com/techempower/act/beetlsql/BeetlSqlController.java

Lines changed: 15 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
package com.techempower.act.beetlsql;
22

3-
import act.app.conf.AutoConfig;
43
import act.controller.Controller;
5-
import org.osgl.$;
64
import org.osgl.mvc.annotation.GetAction;
75
import org.osgl.mvc.result.Result;
8-
import org.osgl.util.Const;
96

107
import java.util.ArrayList;
118
import java.util.Collections;
@@ -18,64 +15,57 @@
1815
* Testing for Act on BeetlSQL
1916
*/
2017
@Controller("beetlsql")
21-
@AutoConfig
2218
@SuppressWarnings("unused")
2319
public class BeetlSqlController extends Controller.Util {
2420

25-
/**
26-
* This constant will get populated with the value set in
27-
* `app.world.max_row` configuration item
28-
*/
29-
public static final Const<Integer> WORLD_MAX_ROW = $.constant();
30-
3121
@GetAction("db")
32-
public final void singleQuery(World.Mapper worldDao) {
33-
json(findOne(worldDao));
22+
public final void singleQuery(World.Mapper worldMapper) {
23+
json(findOne(worldMapper));
3424
}
3525

3626
@GetAction("queries")
37-
public final Result multipleQueries(String queries, World.Mapper worldDao) {
27+
public final Result multipleQueries(String queries, World.Mapper worldMapper) {
3828
int q = regulateQueries(queries);
3929

4030
World[] worlds = new World[q];
4131
for (int i = 0; i < q; ++i) {
42-
worlds[i] = findOne(worldDao);
32+
worlds[i] = findOne(worldMapper);
4333
}
4434
return json(worlds);
4535
}
4636

4737
@GetAction("updates")
48-
public final void updateQueries(String queries, World.Mapper worldDao) {
38+
public final void updateQueries(String queries, World.Mapper worldMapper) {
4939
int q = regulateQueries(queries);
50-
List<World> retVal = doUpdate(q, worldDao);
40+
List<World> retVal = doUpdate(q, worldMapper);
5141
json(retVal);
5242
}
5343

5444
@GetAction("fortunes")
55-
public void fortunes(Fortune.Mapper fortuneDao) {
56-
List<Fortune> fortunes = fortuneDao.all();
45+
public void fortunes(Fortune.Mapper fortuneMapper) {
46+
List<Fortune> fortunes = fortuneMapper.all();
5747
fortunes.add(new Fortune(0, "Additional fortune added at request time."));
5848
Collections.sort(fortunes);
5949
template("fortunes.mustache", fortunes);
6050
}
6151

62-
protected List<World> doUpdate(int q, World.Mapper worldDao) {
52+
protected List<World> doUpdate(int q, World.Mapper worldMapper) {
6353
List<World> retVal = new ArrayList<>(q);
6454
for (int i = 0; i < q; ++i) {
65-
retVal.add(findAndModifyOne(worldDao));
55+
retVal.add(findAndModifyOne(worldMapper));
6656
}
6757
return retVal;
6858
}
6959

70-
private World findOne(World.Mapper worldDao) {
71-
return worldDao.single(randomWorldNumber());
60+
private World findOne(World.Mapper worldMapper) {
61+
return worldMapper.single(randomWorldNumber());
7262
}
7363

74-
private World findAndModifyOne(World.Mapper worldDao) {
75-
World world = findOne(worldDao);
64+
private World findAndModifyOne(World.Mapper worldMapper) {
65+
World world = findOne(worldMapper);
7666
notFoundIfNull(world);
7767
world.setRandomNumber(randomWorldNumber());
78-
worldDao.updateById(world);
68+
worldMapper.updateById(world);
7969
return world;
8070
}
8171

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package com.techempower.act.jdbc;
2+
3+
import act.app.DbServiceManager;
4+
import act.controller.Controller;
5+
import act.db.sql.SqlDbService;
6+
import com.techempower.act.beetlsql.Fortune;
7+
import com.techempower.act.beetlsql.World;
8+
import org.osgl.mvc.annotation.GetAction;
9+
import org.osgl.mvc.result.Result;
10+
11+
import java.sql.Connection;
12+
import java.sql.PreparedStatement;
13+
import java.sql.ResultSet;
14+
import java.sql.SQLException;
15+
import java.util.ArrayList;
16+
import java.util.Collections;
17+
import java.util.List;
18+
19+
import static com.techempower.act.controller.WorldControllerBase.randomWorldNumber;
20+
import static com.techempower.act.controller.WorldControllerBase.regulateQueries;
21+
22+
/**
23+
* Testing for Act on raw JDBC
24+
*/
25+
@Controller("jdbc")
26+
@SuppressWarnings("unused")
27+
public class JdbcController extends Controller.Util {
28+
29+
private Connection conn(DbServiceManager dsm) throws SQLException {
30+
SqlDbService pgsql = dsm.dbService("pgsql");
31+
return pgsql.dataSource().getConnection();
32+
}
33+
34+
@GetAction("db")
35+
public final void singleQuery(DbServiceManager dsm) throws SQLException {
36+
try (Connection conn = conn(dsm)) {
37+
throw json(findOne(query(conn)));
38+
}
39+
}
40+
41+
@GetAction("queries")
42+
public final Result multipleQueries(String queries, DbServiceManager dsm) throws SQLException {
43+
int q = regulateQueries(queries);
44+
45+
World[] worlds = new World[q];
46+
try (Connection conn = conn(dsm)) {
47+
PreparedStatement query = query(conn);
48+
for (int i = 0; i < q; ++i) {
49+
worlds[i] = findOne(query);
50+
}
51+
}
52+
return json(worlds);
53+
}
54+
55+
@GetAction("updates")
56+
public final Result updateQueries(String queries, DbServiceManager dsm) throws SQLException {
57+
int count = regulateQueries(queries);
58+
World[] worlds = new World[count];
59+
try (Connection conn = conn(dsm)) {
60+
try (PreparedStatement query = query(conn);
61+
PreparedStatement update = update(conn)) {
62+
for (int i = 0; i < count; i++) {
63+
final int id = randomWorldNumber();
64+
query.setInt(1, id);
65+
66+
try (ResultSet results = query.executeQuery()) {
67+
if (results.next()) {
68+
worlds[i] = new World(id, results.getInt("randomNumber"));
69+
worlds[i].setRandomNumber(randomWorldNumber());
70+
update.setInt(1, worlds[i].getRandomNumber());
71+
update.setInt(2, id);
72+
update.execute();
73+
}
74+
}
75+
}
76+
}
77+
}
78+
return json(worlds);
79+
}
80+
81+
@GetAction("fortunes")
82+
public void fortunes(DbServiceManager dsm) throws SQLException {
83+
List<Fortune> fortunes = new ArrayList<>();
84+
try (Connection conn = conn(dsm)) {
85+
ResultSet set = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)
86+
.executeQuery("SELECT id, message FROM Fortune");
87+
while (set.next()) {
88+
fortunes.add(new Fortune(set.getInt(1), set.getString(2)));
89+
}
90+
}
91+
fortunes.add(new Fortune(0, "Additional fortune added at request time."));
92+
Collections.sort(fortunes);
93+
template("fortunes.mustache", fortunes);
94+
}
95+
96+
private World findOne(PreparedStatement statement) throws SQLException {
97+
World world;
98+
statement.setInt(1, randomWorldNumber());
99+
try (ResultSet resultSet = statement.executeQuery()) {
100+
resultSet.next();
101+
return new World(resultSet.getInt("id"), resultSet.getInt("randomNumber"));
102+
}
103+
}
104+
105+
private PreparedStatement query(Connection conn) throws SQLException {
106+
return conn.prepareStatement("SELECT * FROM world WHERE id = ?", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
107+
}
108+
109+
private PreparedStatement update(Connection conn) throws SQLException {
110+
return conn.prepareStatement("UPDATE World SET randomNumber = ? WHERE id= ?");
111+
}
112+
113+
114+
}

frameworks/Java/act/src/main/resources/conf/common/app.properties

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,5 @@ metric=false
1313
# World max row is 10,000
1414
app.world.max_row=10000
1515

16+
xio.worker_threads.max=256
17+

0 commit comments

Comments
 (0)