Skip to the content.

MySplitter

[中文] [GitHub] [Apache License 2.0]

MySplitter is a lightweight JDBC middleware for read/write splitting, multiple data sources, high availability, load balancing, and routed database connections.

The current release line is 1.1.0. It keeps the production default safe with local JDBC transactions, while introducing a gated experimental XA transaction MVP for teams validating distributed transactions across multiple database brands.

What MySplitter Helps With

Release Status

Area Status
Latest release 1.1.0
Java baseline Java 8+
Spring Boot starter Spring Boot 2.7.x
Primary pool baseline HikariCP
Configuration format YAML
Production transaction mode local
Experimental transaction mode xa, gated by mysplitter.experimental.xa.enabled=true

Core Features

Experimental XA In 1.1.0

XA support is available for development validation, but it is not the production default yet.

What is implemented:

Important caveats:

Maven Coordinates

Core library:

<dependency>
    <groupId>com.mysplitter</groupId>
    <artifactId>mysplitter</artifactId>
    <version>1.1.0</version>
</dependency>

Spring Boot starter:

<dependency>
    <groupId>com.mysplitter</groupId>
    <artifactId>mysplitter-spring-boot-starter</artifactId>
    <version>1.1.0</version>
</dependency>

Spring Boot Quick Start

application.yml

spring:
  datasource:
    mysplitter:
      configuration-file: classpath:mysplitter.yml

mysplitter.yml

mysplitter:
  passwordSource: environment
  databasesRoutingHandler: com.example.DatabaseRouter
  readAndWriteParser: com.example.ReadAndWriteParser
  illAlertHandler: com.example.DataSourceIllAlertHandler
  common:
    dataSourceClass: com.zaxxer.hikari.HikariDataSource
    loadBalance:
      read:
        enabled: true
        strategy: polling
        failTimeout: 30s
      write:
        enabled: true
        strategy: polling
        failTimeout: 30s
  databases:
    database-a:
      readers:
        reader-1:
          configuration:
            jdbcUrl: jdbc:mysql://localhost:3306/user
            username: ${DB_USER}
            password: ${DB_PASSWORD}
            driverClassName: com.mysql.cj.jdbc.Driver
            connectionTimeout: 1000
      writers:
        writer-1:
          configuration:
            jdbcUrl: jdbc:mysql://localhost:3306/user
            username: ${DB_USER}
            password: ${DB_PASSWORD}
            driverClassName: com.mysql.cj.jdbc.Driver
            connectionTimeout: 1000

For local development, passwordSource: plain is also supported when you intentionally want to keep credentials in a local configuration file.

Experimental XA Configuration Preview

mysplitter:
  transaction:
    mode: xa
    coordinator:
      type: embedded
      logStore: file
      logFile: ./target/mysplitter-xa.log
    recovery:
      enabled: true
      interval: 10s
  databases:
    database-a:
      writers:
        writer-1:
          configuration:
            jdbcUrl: jdbc:mysql://127.0.0.1:3306/app
            username: ${DB_USER}
            password: ${DB_PASSWORD}
            driverClassName: com.mysql.cj.jdbc.Driver
            xaDataSourceClass: com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
            xaProperties:
              url: jdbc:mysql://127.0.0.1:3306/app?useSSL=false
              user: ${DB_USER}
              password: ${DB_PASSWORD}

Run with:

java -Dmysplitter.experimental.xa.enabled=true ...

Documentation In The Repository

Project Direction