#1232 - Performance: Add support for a second read-only DataSource (for implicit query-only transactions)

This commit is contained in:
Rob Bygrave
2018-01-09 16:35:22 +13:00
parent 01539091ef
commit 932986a6b5
27 changed files with 1128 additions and 100 deletions
@@ -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()