Skip to content

Commit

Permalink
update to use ShardingSphereDriver (#56)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhfeng authored Sep 23, 2022
1 parent a559cf3 commit c429923
Show file tree
Hide file tree
Showing 15 changed files with 267 additions and 366 deletions.
Original file line number Diff line number Diff line change
@@ -1,50 +1,54 @@
package io.quarkiverse.shardingsphere.jdbc.deployment;

import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Singleton;

import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
import org.jboss.jandex.DotName;

import io.quarkiverse.shardingsphere.jdbc.ShardingsphereConfig;
import io.quarkiverse.shardingsphere.jdbc.ShardingsphereJdbcRecorder;
import io.quarkus.agroal.spi.JdbcDataSourceBuildItem;
import io.quarkus.arc.deployment.SyntheticBeanBuildItem;
import io.quarkiverse.shardingsphere.jdbc.ShardingSphereAgroalConnectionConfigurer;
import io.quarkus.agroal.spi.JdbcDriverBuildItem;
import io.quarkus.arc.deployment.AdditionalBeanBuildItem;
import io.quarkus.arc.processor.BuiltinScope;
import io.quarkus.datasource.deployment.spi.DefaultDataSourceDbKindBuildItem;
import io.quarkus.datasource.deployment.spi.DevServicesDatasourceConfigurationHandlerBuildItem;
import io.quarkus.deployment.Capabilities;
import io.quarkus.deployment.Capability;
import io.quarkus.deployment.annotations.BuildProducer;
import io.quarkus.deployment.annotations.BuildStep;
import io.quarkus.deployment.annotations.ExecutionTime;
import io.quarkus.deployment.annotations.Record;
import io.quarkus.deployment.builditem.FeatureBuildItem;
import io.quarkus.deployment.builditem.SslNativeConfigBuildItem;

class ShardingsphereJdbcProcessor {
public class ShardingsphereJdbcProcessor {

private static final String FEATURE = "shardingsphere-jdbc";
private static final DotName DATA_SOURCE = DotName.createSimple(javax.sql.DataSource.class.getName());
private static final String SHARDING_SPHERE_DB_KIND = "shardingsphere";

@BuildStep
FeatureBuildItem feature() {
return new FeatureBuildItem(FEATURE);
}

@BuildStep
@Record(ExecutionTime.RUNTIME_INIT)
void generateShardingSphereDataSource(ShardingsphereJdbcRecorder recorder,
List<JdbcDataSourceBuildItem> dataSourceBuildItems,
ShardingsphereConfig config,
BuildProducer<SyntheticBeanBuildItem> syntheticBeanBuildItemBuildProducer) {
List<String> dataSources = dataSourceBuildItems
.stream().filter(ds -> !ds.isDefault()).map(ds -> ds.getName()).collect(Collectors.toList());

SyntheticBeanBuildItem.ExtendedBeanConfigurator configurator = SyntheticBeanBuildItem
.configure(ShardingSphereDataSource.class)
.addType(DATA_SOURCE)
.scope(Singleton.class)
.setRuntimeInit()
.unremovable()
.supplier(recorder.shardingsphereDataSourceSupplier(config, dataSources));

syntheticBeanBuildItemBuildProducer.produce(configurator.done());
void registerDriver(BuildProducer<JdbcDriverBuildItem> jdbcDriver,
SslNativeConfigBuildItem sslNativeConfigBuildItem) {
jdbcDriver.produce(
new JdbcDriverBuildItem(SHARDING_SPHERE_DB_KIND, "org.apache.shardingsphere.driver.ShardingSphereDriver"));
}

@BuildStep
void configureAgroalConnection(BuildProducer<AdditionalBeanBuildItem> additionalBeans,
Capabilities capabilities) {
if (capabilities.isPresent(Capability.AGROAL)) {
additionalBeans
.produce(new AdditionalBeanBuildItem.Builder().addBeanClass(ShardingSphereAgroalConnectionConfigurer.class)
.setDefaultScope(BuiltinScope.APPLICATION.getName())
.setUnremovable()
.build());
}
}

@BuildStep
DevServicesDatasourceConfigurationHandlerBuildItem devDbHandler() {
return DevServicesDatasourceConfigurationHandlerBuildItem.jdbc(SHARDING_SPHERE_DB_KIND);
}

@BuildStep
void registerDefaultDbType(BuildProducer<DefaultDataSourceDbKindBuildItem> dbKind) {
dbKind.produce(new DefaultDataSourceDbKindBuildItem(SHARDING_SPHERE_DB_KIND));
}
}
2 changes: 1 addition & 1 deletion integration-tests/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
<version>${project.version}</version>
<exclusions>
<exclusion>
<groupId>org.codehaus.groovy</groupId>
<groupId>org.apache.groovy</groupId>
<artifactId>groovy</artifactId>
</exclusion>
</exclusions>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
import java.sql.SQLException;
import java.sql.Statement;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.event.Observes;
import javax.enterprise.inject.literal.NamedLiteral;
import javax.inject.Inject;
import javax.inject.Named;
import javax.sql.DataSource;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
Expand All @@ -19,28 +20,27 @@
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import io.quarkus.runtime.ShutdownEvent;
import io.quarkus.runtime.StartupEvent;
import io.quarkus.arc.Arc;

@Path("/shardingsphere-jdbc")
@ApplicationScoped
public class ShardingTablesResource {
@Inject
DataSource dataSource;

@Named("ds")
DataSource h2_ds;

void onStart(@Observes StartupEvent ev) throws Exception {
@PostConstruct
void onStart() throws Exception {
createAccountTable();
}

void onStop(@Observes ShutdownEvent ev) throws Exception {
@PreDestroy
void onStop() throws Exception {
dropAccountTable();
}

private void createAccountTable() throws SQLException {
String sql = "CREATE TABLE t_account (account_id BIGINT NOT NULL AUTO_INCREMENT, user_id INT NOT NULL, status VARCHAR(50), PRIMARY KEY (account_id))";

try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
statement.executeUpdate(sql);
Expand Down Expand Up @@ -69,16 +69,20 @@ public Integer createAccount(Account account) throws Exception {
statement.setInt(2, account.getUser_id());
statement.setString(3, account.getStatus());
result = statement.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}

return result;
}

@GET
@Path("/account/{tbl}")
public Integer count(@PathParam("tbl") String table) throws Exception {
@Path("/account/{ds}/{tbl}")
public Integer count(@PathParam("ds") String ds, @PathParam("tbl") String table) throws Exception {
DataSource dataSource = Arc.container().instance(DataSource.class, NamedLiteral.of(ds)).get();

String sql = "SELECT COUNT(*) from " + table;
try (Connection connection = h2_ds.getConnection();
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
ResultSet result = statement.executeQuery(sql);
if (result.next()) {
Expand All @@ -88,4 +92,4 @@ public Integer count(@PathParam("tbl") String table) throws Exception {
}
}
}
}
}

This file was deleted.

14 changes: 11 additions & 3 deletions integration-tests/src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
# H2 DataSource
quarkus.datasource.devservices.enabled=false

quarkus.datasource.ds.db-kind=h2
quarkus.datasource.ds.username=sa
quarkus.datasource.ds.jdbc.url=jdbc:h2:mem:ds
quarkus.datasource.ds_0.db-kind=h2
quarkus.datasource.ds_0.username=sa
quarkus.datasource.ds_0.jdbc.url=jdbc:h2:mem:ds_0

quarkus.datasource.ds_1.db-kind=h2
quarkus.datasource.ds_1.username=sa
quarkus.datasource.ds_1.jdbc.url=jdbc:h2:mem:ds_1

quarkus.datasource.db-kind=shardingsphere
quarkus.datasource.jdbc.url=jdbc:shardingsphere:classpath:config.yaml
#quarkus.datasource.jdbc.acquisition-timeout=2H
70 changes: 70 additions & 0 deletions integration-tests/src/main/resources/config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
databaseName: sharding_db

dataSources:
ds_0:
dataSourceClassName: io.quarkiverse.shardingsphere.jdbc.QuarkusDataSource
dsName: ds_0
ds_1:
dataSourceClassName: io.quarkiverse.shardingsphere.jdbc.QuarkusDataSource
dsName: ds_1

rules:
- !SHARDING
tables:
t_order:
actualDataNodes: ds_${0..1}.t_order_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t-order-inline
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
t_order_item:
actualDataNodes: ds_${0..1}.t_order_item_${0..1}
tableStrategy:
standard:
shardingColumn: order_id
shardingAlgorithmName: t-order-item-inline
keyGenerateStrategy:
column: order_id
keyGeneratorName: snowflake
t_account:
actualDataNodes: ds_${0..1}.t_account_${0..1}
tableStrategy:
standard:
shardingColumn: account_id
shardingAlgorithmName: t-account-inline

bindingTables:
- t_order,t_order_item

defaultDatabaseStrategy:
standard:
shardingColumn: user_id
shardingAlgorithmName: database-inline

defaultTableStrategy:
none:

shardingAlgorithms:
database-inline:
type: INLINE
props:
algorithm-expression: ds_${user_id % 2}
t-order-inline:
type: INLINE
props:
algorithm-expression: t_order_${order_id % 2}
t-order-item-inline:
type: INLINE
props:
algorithm-expression: t_order_item_${order_id % 2}
t-account-inline:
type: INLINE
props:
algorithm-expression: t_account_${account_id % 2}

keyGenerators:
snowflake:
type: SNOWFLAKE

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,9 @@
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.h2.H2DatabaseTestResource;
import io.quarkus.test.junit.QuarkusTest;
import io.quarkus.test.junit.TestProfile;
import io.restassured.http.ContentType;

@QuarkusTest
@TestProfile(ShardingTablesProfile.class)
@QuarkusTestResource(H2DatabaseTestResource.class)
public class ShardingTablesTest {

Expand All @@ -25,12 +23,22 @@ public void test() {
.statusCode(200)
.body(is("1"));

given().get("/shardingsphere-jdbc/account/t_account_0")
given().get("/shardingsphere-jdbc/account/ds_0/t_account_0")
.then()
.statusCode(200)
.body(is("0"));

given().get("/shardingsphere-jdbc/account/t_account_1")
given().get("/shardingsphere-jdbc/account/ds_0/t_account_1")
.then()
.statusCode(200)
.body(is("0"));

given().get("/shardingsphere-jdbc/account/ds_1/t_account_0")
.then()
.statusCode(200)
.body(is("0"));

given().get("/shardingsphere-jdbc/account/ds_1/t_account_1")
.then()
.statusCode(200)
.body(is("1"));
Expand Down
3 changes: 1 addition & 2 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<quarkus.version>2.13.0.Final</quarkus.version>
<antlr.version>4.9.2</antlr.version> <!-- it needs to align with the antlr4-runtime version in shardingsphere -->
<shardingsphere.version>5.0.0</shardingsphere.version>
<shardingsphere.version>5.2.0</shardingsphere.version>
</properties>
<dependencyManagement>
<dependencies>
Expand All @@ -51,7 +51,6 @@
<artifactId>antlr4-runtime</artifactId>
<version>${antlr.version}</version>
</dependency>

</dependencies>
</dependencyManagement>
<build>
Expand Down
2 changes: 1 addition & 1 deletion runtime/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<plugins>
<plugin>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-bootstrap-maven-plugin</artifactId>
<artifactId>quarkus-extension-maven-plugin</artifactId>
<version>${quarkus.version}</version>
<executions>
<execution>
Expand Down
Loading

0 comments on commit c429923

Please sign in to comment.