Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial commit of performance tests. #744

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
<module>transactionoutbox-guice</module>
<module>transactionoutbox-testing</module>
<module>transactionoutbox-acceptance</module>
<!-- <module>transactionoutbox-performance</module>-->
</modules>
<dependencyManagement>
<dependencies>
Expand Down Expand Up @@ -90,6 +91,12 @@
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,28 @@
package com.gruelbox.transactionoutbox.spi;

import com.gruelbox.transactionoutbox.*;
import java.util.Deque;
import java.util.LinkedList;
import java.util.Optional;
import com.gruelbox.transactionoutbox.NoTransactionActiveException;
import com.gruelbox.transactionoutbox.ThreadLocalContextTransactionManager;
import com.gruelbox.transactionoutbox.ThrowingTransactionalSupplier;
import com.gruelbox.transactionoutbox.ThrowingTransactionalWork;
import com.gruelbox.transactionoutbox.TransactionalSupplier;
import com.gruelbox.transactionoutbox.TransactionalWork;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import lombok.extern.slf4j.Slf4j;

import java.util.Deque;
import java.util.Optional;
import java.util.concurrent.ConcurrentLinkedDeque;

@Slf4j
@SuperBuilder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public abstract class AbstractThreadLocalTransactionManager<TX extends SimpleTransaction>
implements ThreadLocalContextTransactionManager {

private final ThreadLocal<Deque<TX>> transactions = ThreadLocal.withInitial(LinkedList::new);
private final ThreadLocal<Deque<TX>> transactions =
ThreadLocal.withInitial(ConcurrentLinkedDeque::new);

@Override
public final void inTransaction(Runnable runnable) {
Expand Down
149 changes: 149 additions & 0 deletions transactionoutbox-performance/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>com.gruelbox</groupId>
<artifactId>transactionoutbox-parent</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<name>Transaction Outbox Performance Tests</name>
<packaging>jar</packaging>
<artifactId>transactionoutbox-performance</artifactId>
<description>A collection of performance tests to make sure there are no performance regressions and to show ideas for how to performance test your own implementation.</description>
<dependencies>
<dependency>
<groupId>com.gruelbox</groupId>
<artifactId>transactionoutbox-core</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>

<!-- Compile time -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>

<!-- Test dependencies -->
<dependency>
<groupId>com.gruelbox</groupId>
<artifactId>transactionoutbox-testing</artifactId>
<version>${project.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>oracle-xe</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mysql</artifactId>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>mssqlserver</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.jsmart</groupId>
<artifactId>zerocode-tdd-jupiter</artifactId>
<version>1.3.44</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.17.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
<version>3.5.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit-platform</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.5.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit-platform</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>3.5.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-junit-platform</artifactId>
<version>3.2.5</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-project-info-reports-plugin</artifactId>
<version>3.1.1</version>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.gruelbox.transactionoutbox.performance;

import com.gruelbox.transactionoutbox.DefaultPersistor;
import com.gruelbox.transactionoutbox.Dialect;
import com.gruelbox.transactionoutbox.Persistor;
import com.gruelbox.transactionoutbox.TransactionManager;
import com.gruelbox.transactionoutbox.TransactionOutbox;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

@Slf4j
public abstract class AbstractPerformanceTest {
protected abstract Dialect dialect();

protected Persistor persistor = DefaultPersistor.builder().dialect(dialect()).build();

Persistor persistor() {
return persistor;
}

protected abstract TransactionManager txManager();

@Test
public void testInsertAndSelect() {
// Given
TransactionOutbox outbox =
TransactionOutbox.builder().transactionManager(txManager()).persistor(persistor()).build();

// When
txManager()
.inTransaction(tx -> outbox.schedule(Widget.class).widgetize(UUID.randomUUID().toString()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.gruelbox.transactionoutbox.performance;

import com.gruelbox.transactionoutbox.Dialect;
import com.gruelbox.transactionoutbox.TransactionManager;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class TestDefaultPerformanceH2 extends AbstractPerformanceTest {
private final TransactionManager txManager =
TransactionManager.fromConnectionDetails(
"org.h2.Driver",
"jdbc:h2:mem:test;DB_CLOSE_DELAY=-1;DEFAULT_LOCK_TIMEOUT=2000;LOB_TIMEOUT=2000;MV_STORE=TRUE",
"test",
"test");

@Override
protected TransactionManager txManager() {
return txManager;
}

@Override
protected Dialect dialect() {
return Dialect.H2;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.gruelbox.transactionoutbox.performance;

import com.gruelbox.transactionoutbox.Dialect;
import com.gruelbox.transactionoutbox.TransactionManager;
import org.junit.jupiter.api.BeforeAll;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class TestDefaultPerformanceMSSqlServer2017 extends AbstractPerformanceTest {

@SuppressWarnings({"rawtypes"})
private static final JdbcDatabaseContainer container = ContainerUtils.getMSSQL2017Container();

private final TransactionManager txManager =
TransactionManager.fromConnectionDetails(
"com.mysql.cj.jdbc.Driver",
container.getJdbcUrl(),
container.getUsername(),
container.getPassword());

@Override
protected TransactionManager txManager() {
return txManager;
}

@Override
protected Dialect dialect() {
return Dialect.MS_SQL_SERVER;
}

@BeforeAll
public static void beforeAll() {
container.start();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.gruelbox.transactionoutbox.performance;

import com.gruelbox.transactionoutbox.Dialect;
import com.gruelbox.transactionoutbox.TransactionManager;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class TestDefaultPerformanceMySql5 extends AbstractPerformanceTest {

@SuppressWarnings({"rawtypes"})
private static final JdbcDatabaseContainer container = ContainerUtils.getMySql5Container();

private final TransactionManager txManager =
TransactionManager.fromConnectionDetails(
"com.mysql.cj.jdbc.Driver",
container.getJdbcUrl(),
container.getUsername(),
container.getPassword());

@Override
protected TransactionManager txManager() {
return txManager;
}

@Override
protected Dialect dialect() {
return Dialect.MY_SQL_5;
}

@BeforeAll
public static void beforeAll() {
container.start();
}

@AfterAll
public static void afterAll() {
container.stop();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.gruelbox.transactionoutbox.performance;

import com.gruelbox.transactionoutbox.Dialect;
import com.gruelbox.transactionoutbox.TransactionManager;
import org.junit.jupiter.api.BeforeAll;
import org.testcontainers.containers.JdbcDatabaseContainer;
import org.testcontainers.junit.jupiter.Testcontainers;

@Testcontainers
public class TestDefaultPerformanceMySql8 extends AbstractPerformanceTest {

@SuppressWarnings({"rawtypes"})
private static final JdbcDatabaseContainer container = ContainerUtils.getMySql8Container();

private final TransactionManager txManager =
TransactionManager.fromConnectionDetails(
"com.mysql.cj.jdbc.Driver",
container.getJdbcUrl(),
container.getUsername(),
container.getPassword());

@Override
protected TransactionManager txManager() {
return txManager;
}

@Override
protected Dialect dialect() {
return Dialect.MY_SQL_8;
}

@BeforeAll
public static void beforeAll() {
container.start();
}
}
Loading
Loading