GH-866 - JDBC event publication support for Oracle database.

We now support Oracle as database backend for the JDBC-based EventPublicationRegistry.

Original pull request: GH-868.
This commit is contained in:
DSX
2024-10-10 23:17:52 +08:00
committed by Oliver Drotbohm
parent 5f1d3903b0
commit 5dee1bd9cf
7 changed files with 61 additions and 1 deletions

View File

@@ -116,6 +116,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>oracle-free</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
@@ -152,6 +158,12 @@
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@@ -82,6 +82,24 @@ enum DatabaseType {
return UUID.fromString(id.toString());
}
@Override
boolean isSchemaSupported() {
return false;
}
},
ORACLE("oracle", "Oracle") {
@Override
Object uuidToDatabase(UUID id) {
return id.toString();
}
@Override
UUID databaseToUUID(Object id) {
return UUID.fromString(id.toString());
}
@Override
boolean isSchemaSupported() {
return false;

View File

@@ -400,7 +400,7 @@ class JdbcEventPublicationRepository implements EventPublicationRepository, Bean
var completionDate = rs.getTimestamp("COMPLETION_DATE");
var publicationDate = rs.getTimestamp("PUBLICATION_DATE").toInstant();
var listenerId = rs.getString("LISTENER_ID");
var serializedEvent = rs.getString("SERIALIZED_EVENT");
var serializedEvent = Optional.ofNullable(rs.getString("SERIALIZED_EVENT")).orElse("");
return new JdbcEventPublication(id, publicationDate, listenerId,
() -> serializer.deserialize(serializedEvent, eventClass),

View File

@@ -0,0 +1,11 @@
-- oracle database support 'create xx if not exists' from 23c, lower version should create table and index manually
CREATE TABLE IF NOT EXISTS EVENT_PUBLICATION (
ID VARCHAR2(36) NOT NULL,
LISTENER_ID VARCHAR2(512) NOT NULL,
EVENT_TYPE VARCHAR2(512) NOT NULL,
SERIALIZED_EVENT VARCHAR2(4000),
PUBLICATION_DATE TIMESTAMP(6) NOT NULL,
COMPLETION_DATE TIMESTAMP(6),
CONSTRAINT EVENT_PUBLICATION_PK PRIMARY KEY(ID)
);
CREATE INDEX IF NOT EXISTS EVENT_PUBLICATION_BY_COMPLETION_DATE_IDX ON EVENT_PUBLICATION (COMPLETION_DATE);

View File

@@ -130,4 +130,8 @@ class DatabaseSchemaInitializerIntegrationTests {
@Nested
@ActiveProfiles("mssql")
class MSSQL extends WithInitEnabled {}
@Nested
@ActiveProfiles("oracle")
class Oracle extends WithInitEnabled {}
}

View File

@@ -476,6 +476,14 @@ class JdbcEventPublicationRepositoryIntegrationTests {
@WithMariaDB
class MariaDBWithDeleteCompletion extends WithDeleteCompletion {}
// Oracle
@WithOracle
class OracleWithNoDefinedSchemaName extends WithNoDefinedSchemaName {}
@WithOracle
class OracleWithDeleteCompletion extends WithDeleteCompletion {}
@Value
private static final class TestEvent {
@@ -515,4 +523,9 @@ class JdbcEventPublicationRepositoryIntegrationTests {
@ActiveProfiles("mssql")
@Retention(RetentionPolicy.RUNTIME)
@interface WithMssql {}
@Nested
@ActiveProfiles("oracle")
@Retention(RetentionPolicy.RUNTIME)
@interface WithOracle {}
}

View File

@@ -0,0 +1,2 @@
spring.datasource.url=jdbc:tc:oracle:23-slim-faststart:///events
spring.datasource.driverClassName=org.testcontainers.jdbc.ContainerDatabaseDriver