Skip to content

Commit 79f7135

Browse files
committed
#4 HikariCP and #5 export DataSource on EbeanDao and EbeanService
1 parent 9d0b293 commit 79f7135

File tree

3 files changed

+121
-10
lines changed

3 files changed

+121
-10
lines changed

pom.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
********************************************
1919
* version history
2020
********************************************
21+
1.0.2
22+
- #4 use HikariCP for connection pool
23+
- #5 Make it easy to do low level JDBC logic
2124
1.0.1
2225
- Fix #1 EbeanDao.drop() method cause JdbcSQLException
2326
- Fix #3 EbeanInjectionListener not effect on User defined Dao
@@ -56,6 +59,7 @@
5659
<ebean-agent.version>8.1.1</ebean-agent.version>
5760
<ebean-agent-loader.version>2.1.2</ebean-agent-loader.version>
5861
<mockito-core.version>2.7.0</mockito-core.version>
62+
<HikariCP.version>2.6.1</HikariCP.version>
5963
</properties>
6064

6165
<parent>
@@ -174,6 +178,13 @@
174178
<scope>provided</scope>
175179
</dependency>
176180

181+
<dependency>
182+
<groupId>com.zaxxer</groupId>
183+
<artifactId>HikariCP</artifactId>
184+
<version>${HikariCP.version}</version>
185+
<scope>compile</scope>
186+
</dependency>
187+
177188
</dependencies>
178189

179190
<profiles>

src/main/java/act/db/ebean/EbeanDao.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import org.osgl.util.S;
1818

1919
import javax.persistence.Id;
20+
import javax.sql.DataSource;
2021
import java.lang.reflect.Array;
2122
import java.lang.reflect.Field;
2223
import java.util.Collection;
@@ -32,6 +33,7 @@ public class EbeanDao<ID_TYPE, MODEL_TYPE> extends DaoBase<ID_TYPE, MODEL_TYPE,
3233
private static final Logger logger = L.get(EbeanDao.class);
3334

3435
private volatile EbeanServer ebean;
36+
private volatile DataSource ds;
3537
private String tableName;
3638
private Field idField = null;
3739
private List<QueryIterator> queryIterators = C.newList();
@@ -45,6 +47,7 @@ public class EbeanDao<ID_TYPE, MODEL_TYPE> extends DaoBase<ID_TYPE, MODEL_TYPE,
4547
super(idType, modelType);
4648
init(modelType);
4749
this.ebean(service.ebean());
50+
this.ds = service.ds();
4851
}
4952

5053
public EbeanDao(Class<ID_TYPE> id_type, Class<MODEL_TYPE> modelType) {
@@ -117,6 +120,22 @@ public EbeanServer ebean() {
117120
return ebean;
118121
}
119122

123+
public DataSource ds() {
124+
if (null != ds) {
125+
return ds;
126+
}
127+
synchronized (this) {
128+
if (null == ds) {
129+
DB db = modelType().getAnnotation(DB.class);
130+
String dbId = null == db ? DbServiceManager.DEFAULT : db.value();
131+
EbeanService dbService = getService(dbId, app().dbServiceManager());
132+
E.NPE(dbService);
133+
ds = dbService.ds();
134+
}
135+
}
136+
return ds;
137+
}
138+
120139
void registerQueryIterator(QueryIterator i) {
121140
queryIterators.add(i);
122141
}

src/main/java/act/db/ebean/EbeanService.java

Lines changed: 91 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.avaje.ebean.EbeanServer;
1212
import com.avaje.ebean.EbeanServerFactory;
1313
import com.avaje.ebean.config.ServerConfig;
14+
import com.zaxxer.hikari.HikariConfig;
15+
import com.zaxxer.hikari.HikariDataSource;
1416
import org.avaje.datasource.DataSourceConfig;
1517
import org.osgl.$;
1618
import org.osgl.logging.LogManager;
@@ -22,6 +24,7 @@
2224
import javax.persistence.Entity;
2325
import javax.persistence.Id;
2426
import javax.persistence.PersistenceException;
27+
import javax.sql.DataSource;
2528
import java.io.File;
2629
import java.lang.annotation.Annotation;
2730
import java.lang.reflect.ParameterizedType;
@@ -45,6 +48,9 @@ public final class EbeanService extends DbService {
4548

4649
private ServerConfig serverConfig;
4750

51+
// the datasource for low level JDBC API usage
52+
private DataSource ds;
53+
4854
private static Set<Class<?>> modelTypes = C.newSet();
4955

5056
public EbeanService(final String dbId, final App app, final Map<String, Object> config) {
@@ -129,22 +135,27 @@ public EbeanServer ebean() {
129135
return ebean;
130136
}
131137

138+
public DataSource ds() {
139+
return ds;
140+
}
141+
132142
private ServerConfig serverConfig(String id, Map<String, Object> conf) {
133143
ServerConfig sc = new ServerConfig();
134144
sc.setName(id);
135145
Properties properties = new Properties();
136146
properties.putAll(conf);
137147
sc.loadFromProperties(properties);
138148

139-
DataSourceConfig dsc = datasourceConfig(conf);
140-
sc.setDataSourceConfig(dsc);
149+
HikariDataSource dataSource = dataSource(conf);
150+
sc.setDataSource(dataSource);
151+
ds = dataSource;
141152

142153
boolean noddl = false;
143154
String ddlGenerate = (String) conf.get("ddl.generate");
144155
if (null != ddlGenerate) {
145156
sc.setDdlGenerate(Boolean.parseBoolean(ddlGenerate));
146157
} else if (Act.isDev()) {
147-
String url = dsc.getUrl();
158+
String url = dataSource.getJdbcUrl();
148159
if (url.startsWith("jdbc:h2:")) {
149160
String file = url.substring("jdbc:h2:".length()) + ".mv.db";
150161
File _file = new File(file);
@@ -176,13 +187,83 @@ private ServerConfig serverConfig(String id, Map<String, Object> conf) {
176187
return sc;
177188
}
178189

179-
private DataSourceConfig datasourceConfig(Map<String, Object> conf) {
180-
Properties properties = new Properties();
181-
properties.putAll(conf);
182-
DataSourceConfig dsc = new DataSourceConfig();
183-
dsc.loadSettings(properties, "");
184-
ensureDefaultDatasourceConfig(dsc);
185-
return dsc;
190+
private HikariDataSource dataSource(Map<String, Object> conf) {
191+
HikariConfig hc = new HikariConfig();
192+
for (Map.Entry<String, Object> entry : conf.entrySet()) {
193+
String key = entry.getKey();
194+
Object val = entry.getValue();
195+
if ("username".equals(key)) {
196+
hc.setUsername(S.string(val));
197+
} else if ("password".equals(key)) {
198+
hc.setPassword(S.string(val));
199+
} else if ("url".equals(key) || "jdbcUrl".equals(key)) {
200+
hc.setJdbcUrl(S.string(val));
201+
} else if ("maximumPoolSize".equals(key)) {
202+
hc.setMaximumPoolSize(Integer.parseInt(S.string(val)));
203+
} else if ("autoCommit".equals(key)) {
204+
hc.setAutoCommit(Boolean.valueOf(S.string(val)));
205+
} else if ("idleTimeout".equals(key)) {
206+
hc.setIdleTimeout(Long.parseLong(S.string(val)));
207+
} else if ("maxLifetime".equals(key)) {
208+
hc.setMaxLifetime(Long.parseLong(S.string(val)));
209+
} else if ("connectionTimeout".equals(key)) {
210+
hc.setConnectionTimeout(Long.parseLong(S.string(val)));
211+
} else if ("minimumIdle".equals(key)) {
212+
hc.setMinimumIdle(Integer.parseInt(S.string(val)));
213+
} else if ("poolName".equals(key)) {
214+
hc.setPoolName(S.string(val));
215+
} else if ("driverClassName".equals(key)) {
216+
hc.setDriverClassName(S.string(val));
217+
} else {
218+
hc.addDataSourceProperty(entry.getKey(), entry.getValue());
219+
}
220+
}
221+
ensureDefaultDatasourceConfig(hc);
222+
return new HikariDataSource(hc);
223+
}
224+
225+
private void ensureDefaultDatasourceConfig(HikariConfig dsc) {
226+
String username = dsc.getUsername();
227+
if (null == username) {
228+
logger.warn("No data source user configuration specified. Will use the default 'sa' user");
229+
username = "sa";
230+
}
231+
dsc.setUsername(username);
232+
233+
String password = dsc.getPassword();
234+
if (null == password) {
235+
password = "";
236+
}
237+
dsc.setPassword(password);
238+
239+
String url = dsc.getJdbcUrl();
240+
if (null == url) {
241+
logger.warn("No database URL configuration specified. Will use the default h2 inmemory test database");
242+
url = "jdbc:h2:mem:tests";
243+
}
244+
dsc.setJdbcUrl(url);
245+
246+
247+
String driver = dsc.getDriverClassName();
248+
if (null == driver) {
249+
if (url.contains("mysql")) {
250+
driver = "com.mysql.jdbc.Driver";
251+
} else if (url.contains("postgresql")) {
252+
driver = "org.postgresql.Driver";
253+
} else if (url.contains("jdbc:h2:")) {
254+
driver = "org.h2.Driver";
255+
} else if (url.contains("jdbc:oracle")) {
256+
driver = "oracle.jdbc.OracleDriver";
257+
} else if (url.contains("sqlserver")) {
258+
driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
259+
} else if (url.contains("jdbc:db2")) {
260+
driver = "com.ibm.db2.jcc.DB2Driver";
261+
} else {
262+
throw E.invalidConfiguration("JDBC driver needs to be configured for datasource: %s", id());
263+
}
264+
logger.warn("JDBC driver not configured, system automatically set to: " + driver);
265+
}
266+
dsc.setDriverClassName(driver);
186267
}
187268

188269
private void ensureDefaultDatasourceConfig(DataSourceConfig dsc) {

0 commit comments

Comments
 (0)