mirror of
https://github.com/ebean-orm/ebean.git
synced 2024-04-21 10:51:47 +00:00
#1232 - Performance: Add support for a second read-only DataSource (for implicit query-only transactions)
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package io.ebean.config;
|
||||
|
||||
import io.ebean.annotation.PersistBatch;
|
||||
import org.avaje.datasource.DataSourceConfig;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Properties;
|
||||
@@ -27,6 +28,9 @@ public class ServerConfigTest {
|
||||
ServerConfig serverConfig = new ServerConfig();
|
||||
serverConfig.setPersistBatch(PersistBatch.NONE);
|
||||
serverConfig.setPersistBatchOnCascade(PersistBatch.NONE);
|
||||
serverConfig.setAutoReadOnlyDataSource(false);
|
||||
serverConfig.setReadOnlyDataSource(null);
|
||||
serverConfig.setReadOnlyDataSourceConfig(new DataSourceConfig());
|
||||
|
||||
Properties props = new Properties();
|
||||
props.setProperty("persistBatch", "INSERT");
|
||||
@@ -38,10 +42,13 @@ public class ServerConfigTest {
|
||||
props.setProperty("backgroundExecutorSchedulePoolSize", "4");
|
||||
props.setProperty("dbOffline", "true");
|
||||
props.setProperty("jsonDateTime", "ISO8601");
|
||||
props.setProperty("autoReadOnlyDataSource", "true");
|
||||
|
||||
serverConfig.loadFromProperties(props);
|
||||
|
||||
assertTrue(serverConfig.isDbOffline());
|
||||
assertTrue(serverConfig.isAutoReadOnlyDataSource());
|
||||
|
||||
assertEquals(PersistBatch.INSERT, serverConfig.getPersistBatch());
|
||||
assertEquals(PersistBatch.INSERT, serverConfig.getPersistBatchOnCascade());
|
||||
assertEquals(ServerConfig.DbUuid.BINARY, serverConfig.getDbTypeConfig().getDbUuid());
|
||||
|
||||
@@ -3,15 +3,19 @@ package org.tests.basic;
|
||||
import io.ebean.BaseTestCase;
|
||||
import io.ebean.Ebean;
|
||||
import io.ebean.Query;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.tests.model.basic.Order;
|
||||
import org.tests.model.basic.ResetBasicData;
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.sql.Timestamp;
|
||||
|
||||
public class TestQueryWhereBetween extends BaseTestCase {
|
||||
|
||||
long statCount;
|
||||
long statTotal;
|
||||
|
||||
@Test
|
||||
public void testCountOrderBy() {
|
||||
|
||||
@@ -27,4 +31,69 @@ public class TestQueryWhereBetween extends BaseTestCase {
|
||||
String sql = query.getGeneratedSql();
|
||||
Assert.assertTrue(sql.contains("between t0.cretime and t0.updtime"));
|
||||
}
|
||||
|
||||
@Ignore
|
||||
@Test
|
||||
public void doStuff() {
|
||||
|
||||
someLoop(3, true);
|
||||
|
||||
int loop = 30000;
|
||||
someLoop(loop, true);
|
||||
someLoop(loop, true);
|
||||
someLoop(loop, true);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
someLoop(loop);
|
||||
|
||||
long avg = statTotal / statCount;
|
||||
System.out.println("avg "+avg);
|
||||
}
|
||||
|
||||
private void someLoop(int loop) {
|
||||
someLoop(loop, false);
|
||||
}
|
||||
private void someLoop(int loop, boolean warm) {
|
||||
|
||||
long start = System.currentTimeMillis();
|
||||
for (int i = 0; i < loop; i++) {
|
||||
someQuery();
|
||||
}
|
||||
|
||||
long exe = System.currentTimeMillis() - start;
|
||||
System.out.println("exe: "+exe);
|
||||
|
||||
if (!warm) {
|
||||
statTotal += exe;
|
||||
statCount++;
|
||||
}
|
||||
}
|
||||
|
||||
private void someQuery() {
|
||||
|
||||
Timestamp t = new Timestamp(System.currentTimeMillis());
|
||||
|
||||
Query<Order> query = Ebean.find(Order.class).setAutoTune(false)
|
||||
.where()
|
||||
.le("cretime", t)
|
||||
.order().asc("orderDate")
|
||||
.order().desc("id");
|
||||
|
||||
query.findList();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,13 +5,14 @@ import io.ebean.Ebean;
|
||||
import io.ebean.EbeanServer;
|
||||
import io.ebean.Query;
|
||||
import io.ebean.QueryIterator;
|
||||
import io.ebean.plugin.SpiServer;
|
||||
import org.avaje.datasource.DataSourcePool;
|
||||
import org.ebeantest.LoggedSqlCollector;
|
||||
import org.junit.Test;
|
||||
import org.tests.model.basic.Customer;
|
||||
import org.tests.model.basic.Order;
|
||||
import org.tests.model.basic.OrderShipment;
|
||||
import org.tests.model.basic.ResetBasicData;
|
||||
import org.avaje.datasource.DataSourcePool;
|
||||
import org.ebeantest.LoggedSqlCollector;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.persistence.PersistenceException;
|
||||
import java.util.List;
|
||||
@@ -19,7 +20,10 @@ import java.util.NoSuchElementException;
|
||||
import java.util.concurrent.atomic.AtomicInteger;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
import static org.junit.Assert.*;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertFalse;
|
||||
import static org.junit.Assert.assertTrue;
|
||||
import static org.junit.Assert.fail;
|
||||
|
||||
public class TestQueryFindIterate extends BaseTestCase {
|
||||
|
||||
@@ -225,11 +229,17 @@ public class TestQueryFindIterate extends BaseTestCase {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
public void testCloseConnection() throws Exception {
|
||||
public void testCloseConnection() {
|
||||
ResetBasicData.reset();
|
||||
DataSourcePool dsPool = (DataSourcePool) server().getPluginApi().getDataSource();
|
||||
|
||||
SpiServer pluginApi = server().getPluginApi();
|
||||
DataSourcePool dsPool = (DataSourcePool) pluginApi.getServerConfig().getReadOnlyDataSource();
|
||||
if (dsPool == null) {
|
||||
dsPool = (DataSourcePool) server().getPluginApi().getDataSource();
|
||||
}
|
||||
|
||||
int startConns = dsPool.getStatus(false).getBusy();
|
||||
QueryIterator<Customer> queryIterator = server().find(Customer.class)
|
||||
.where()
|
||||
|
||||
Reference in New Issue
Block a user