Skip to content

Commit 085b293

Browse files
committed
Implemented connection pooling
1 parent adefe66 commit 085b293

23 files changed

+434
-251
lines changed

src/main/java/org/javawebstack/orm/ORM.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package org.javawebstack.orm;
22

3+
import org.javawebstack.orm.connection.pool.SQLPool;
34
import org.javawebstack.orm.exception.ORMConfigurationException;
45
import org.javawebstack.orm.migration.AutoMigrator;
5-
import org.javawebstack.orm.wrapper.SQL;
66
import org.reflections.Reflections;
77

88
import java.lang.reflect.Modifier;
@@ -19,25 +19,25 @@ public static <T extends Model> Repo<T> repo(Class<T> model) {
1919
return (Repo<T>) repositories.get(model);
2020
}
2121

22-
public static <T extends Model> Repo<T> register(Class<T> model, SQL sql, ORMConfig config) throws ORMConfigurationException {
23-
Repo<T> repo = new Repo<>(model, sql, config);
22+
public static <T extends Model> Repo<T> register(Class<T> model, SQLPool pool, ORMConfig config) throws ORMConfigurationException {
23+
Repo<T> repo = new Repo<>(model, pool, config);
2424
repositories.put(model, repo);
2525
return repo;
2626
}
2727

28-
public static <T extends Model> Repo<T> register(Class<T> model, SQL sql) throws ORMConfigurationException {
29-
return register(model, sql, new ORMConfig());
28+
public static <T extends Model> Repo<T> register(Class<T> model, SQLPool pool) throws ORMConfigurationException {
29+
return register(model, pool, new ORMConfig());
3030
}
3131

32-
public static void register(Package p, SQL sql, ORMConfig config) throws ORMConfigurationException {
32+
public static void register(Package p, SQLPool pool, ORMConfig config) throws ORMConfigurationException {
3333
for (Class<? extends Model> model : new Reflections(p.getName()).getSubTypesOf(Model.class)) {
3434
if (!Modifier.isAbstract(model.getModifiers()))
35-
ORM.register(model, sql, config);
35+
ORM.register(model, pool, config);
3636
}
3737
}
3838

39-
public static void register(Package p, SQL sql) throws ORMConfigurationException {
40-
register(p, sql, new ORMConfig());
39+
public static void register(Package p, SQLPool pool) throws ORMConfigurationException {
40+
register(p, pool, new ORMConfig());
4141
}
4242

4343
public static void unregister(Class<? extends Model> model) {

src/main/java/org/javawebstack/orm/Repo.java

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package org.javawebstack.orm;
22

3+
import org.javawebstack.orm.connection.pool.PooledSQL;
4+
import org.javawebstack.orm.connection.pool.SQLPool;
35
import org.javawebstack.orm.exception.ORMConfigurationException;
46
import org.javawebstack.orm.exception.ORMQueryException;
57
import org.javawebstack.orm.filter.DefaultQueryFilter;
68
import org.javawebstack.orm.filter.QueryFilter;
79
import org.javawebstack.orm.migration.AutoMigrator;
810
import org.javawebstack.orm.query.Query;
9-
import org.javawebstack.orm.wrapper.SQL;
10-
import org.javawebstack.orm.wrapper.builder.SQLQueryString;
11+
import org.javawebstack.orm.renderer.SQLQueryString;
1112

1213
import java.lang.reflect.Field;
1314
import java.sql.SQLException;
@@ -25,14 +26,14 @@ public static <T extends Model> Repo<T> get(Class<T> model) {
2526
}
2627

2728
private final TableInfo info;
28-
private final SQL connection;
29+
private final SQLPool pool;
2930
private final List<Observer<T>> observers = new ArrayList<>();
3031
private Accessible accessible;
3132
private QueryFilter filter;
3233

33-
public Repo(Class<T> clazz, SQL connection, ORMConfig config) throws ORMConfigurationException {
34+
public Repo(Class<T> clazz, SQLPool pool, ORMConfig config) throws ORMConfigurationException {
3435
this.info = new TableInfo(clazz, config);
35-
this.connection = connection;
36+
this.pool = pool;
3637
filter = new DefaultQueryFilter(info.getFilterable(), info.getSearchable());
3738
}
3839

@@ -119,12 +120,13 @@ private void executeCreate(T entry) {
119120
if (map.containsKey(idCol) && map.get(idCol) == null)
120121
map.remove(idCol);
121122
}
122-
SQLQueryString qs = getConnection().builder().buildInsert(info, map);
123-
SQL connection = Session.current() != null ? Session.current().getConnection() : this.connection;
124-
int id = connection.write(qs.getQuery(), qs.getParameters().toArray());
125-
if (info.isAutoIncrement())
126-
info.getField(info.getIdField()).set(entry, id);
127-
entry.setEntryExists(true);
123+
try(PooledSQL connection = pool.get()) {
124+
SQLQueryString qs = connection.builder().buildInsert(info, map);
125+
int id = connection.write(qs.getQuery(), qs.getParameters().toArray());
126+
if (info.isAutoIncrement())
127+
info.getField(info.getIdField()).set(entry, id);
128+
entry.setEntryExists(true);
129+
}
128130
} catch (SQLException | IllegalAccessException throwables) {
129131
throw new ORMQueryException(throwables);
130132
}
@@ -217,8 +219,8 @@ public void autoMigrate() {
217219
AutoMigrator.migrate(this);
218220
}
219221

220-
public SQL getConnection() {
221-
return connection;
222+
public SQLPool getPool() {
223+
return pool;
222224
}
223225

224226
public TableInfo getInfo() {

src/main/java/org/javawebstack/orm/Session.java

Lines changed: 0 additions & 46 deletions
This file was deleted.

src/main/java/org/javawebstack/orm/wrapper/BaseSQL.java renamed to src/main/java/org/javawebstack/orm/connection/BaseSQL.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.javawebstack.orm.wrapper;
1+
package org.javawebstack.orm.connection;
22

33
import org.javawebstack.orm.exception.ORMQueryException;
44

src/main/java/org/javawebstack/orm/wrapper/MySQL.java renamed to src/main/java/org/javawebstack/orm/connection/MySQL.java

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package org.javawebstack.orm.wrapper;
1+
package org.javawebstack.orm.connection;
22

33
import org.javawebstack.orm.exception.ORMQueryException;
4-
import org.javawebstack.orm.wrapper.builder.MySQLQueryStringBuilder;
5-
import org.javawebstack.orm.wrapper.builder.QueryStringBuilder;
4+
import org.javawebstack.orm.renderer.MySQLQueryStringRenderer;
5+
import org.javawebstack.orm.renderer.QueryStringRenderer;
66

77
import java.io.UnsupportedEncodingException;
88
import java.net.URLEncoder;
@@ -93,6 +93,16 @@ public Connection getConnection() {
9393
return c;
9494
}
9595

96+
public void close() {
97+
if(c != null) {
98+
try {
99+
if(!c.isClosed())
100+
c.close();
101+
} catch (SQLException ignored) {}
102+
c = null;
103+
}
104+
}
105+
96106
private static String buildQuery(Map<String, String> params) {
97107
return params.entrySet().stream().map(e -> urlEncode(e.getKey()) + "=" + urlEncode(e.getValue())).collect(Collectors.joining("&"));
98108
}
@@ -105,10 +115,9 @@ private static String urlEncode(String s) {
105115
return s;
106116
}
107117

108-
public QueryStringBuilder builder() {
109-
return MySQLQueryStringBuilder.INSTANCE;
118+
public QueryStringRenderer builder() {
119+
return MySQLQueryStringRenderer.INSTANCE;
110120
}
111121

112-
113122
}
114123

src/main/java/org/javawebstack/orm/wrapper/QueryLogger.java renamed to src/main/java/org/javawebstack/orm/connection/QueryLogger.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package org.javawebstack.orm.wrapper;
1+
package org.javawebstack.orm.connection;
22

33
public interface QueryLogger {
44

src/main/java/org/javawebstack/orm/wrapper/SQL.java renamed to src/main/java/org/javawebstack/orm/connection/SQL.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package org.javawebstack.orm.wrapper;
1+
package org.javawebstack.orm.connection;
22

3-
import org.javawebstack.orm.wrapper.builder.QueryStringBuilder;
3+
import org.javawebstack.orm.renderer.QueryStringRenderer;
44

55
import java.sql.Connection;
66
import java.sql.ResultSet;
@@ -15,13 +15,15 @@ public interface SQL {
1515
int write(String queryString, Object... parameters) throws SQLException;
1616

1717
void close(ResultSet resultSet);
18+
void close();
1819

19-
QueryStringBuilder builder();
20+
QueryStringRenderer builder();
2021

2122
void addQueryLogger(QueryLogger logger);
2223

2324
void removeQueryLogger(QueryLogger logger);
2425

26+
@Deprecated
2527
SQL fork();
2628

2729
}

src/main/java/org/javawebstack/orm/wrapper/SQLite.java renamed to src/main/java/org/javawebstack/orm/connection/SQLite.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package org.javawebstack.orm.wrapper;
1+
package org.javawebstack.orm.connection;
22

3-
import org.javawebstack.orm.wrapper.builder.MySQLQueryStringBuilder;
4-
import org.javawebstack.orm.wrapper.builder.QueryStringBuilder;
3+
import org.javawebstack.orm.renderer.MySQLQueryStringRenderer;
4+
import org.javawebstack.orm.renderer.QueryStringRenderer;
55

66
import java.sql.Connection;
77
import java.sql.DriverManager;
@@ -42,8 +42,18 @@ public Connection getConnection() {
4242
return c;
4343
}
4444

45-
public QueryStringBuilder builder() {
46-
return MySQLQueryStringBuilder.INSTANCE; // TODO Build a custom one for SQLite
45+
public void close() {
46+
if(c != null) {
47+
try {
48+
if(!c.isClosed())
49+
c.close();
50+
} catch (SQLException ignored) {}
51+
c = null;
52+
}
53+
}
54+
55+
public QueryStringRenderer builder() {
56+
return MySQLQueryStringRenderer.INSTANCE; // TODO Build a custom one for SQLite
4757
}
4858

4959

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package org.javawebstack.orm.connection.pool;
2+
3+
public class MinMaxScaler implements PoolScaling {
4+
5+
private final int min;
6+
private final int max;
7+
8+
public MinMaxScaler(int min, int max) {
9+
this.min = min;
10+
this.max = max;
11+
}
12+
13+
public int scale(int total, int used) {
14+
int needed = used + 1;
15+
return Math.max(min, Math.min(max, needed));
16+
}
17+
18+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package org.javawebstack.orm.connection.pool;
2+
3+
public interface PoolScaling {
4+
5+
int scale(int total, int used);
6+
7+
}

0 commit comments

Comments
 (0)