该文章已同步至个人微信公众号[不能止步],欢迎关注。
1. MariaDB4j是什么
MariaDB4j的官网对MariaDB4j的定位为:
MariaDB4j is a Java (!) “launcher” for MariaDB (the “backward compatible, drop-in replacement of the MySQL® Database Server”, see FAQ and Wikipedia), allowing you to use MariaDB (MySQL®) from Java without ANY installation / external dependencies. Read again: You do NOT have to have MariaDB binaries installed on your system to use MariaDB4j!
翻译为中文为:
MariaDB4j是一个MariaDB(一个与MySQL兼容、可直接替换MySQL的数据库)的 Java 启动器,使得在Java应用中使用MariaDB时不需要任何安装或外部依赖。再次强调:使用MariaDB4j后,你不需要在你的系统上安装MariaDB!
可以看出MariaDB4j简化了对MariaDB的使用,其内部封装了MariaDB数据库的生命周期管理(包括下载、数据库的创建、删除等)。
2. 为什么选择MariaDB4j而非H2
从Google Trends看,目前使用最多的开源数据库依然为MySQL。
为了实现持久层的单元测试,开发通常使用H2数据库作为MySQL的测试替身,但是使用H2存在一个严重的问题:需要维护两套schema。如以下创建表的SQL:
CREATE TABLE IF NOT EXISTS t_task
(
id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
service_name VARCHAR(256) NOT NULL,
code VARCHAR(256),
table_name VARCHAR(256)
)ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin;
create unique index task_index_service_table_code
on service_task (service_name, table_name, code);
因为H2不支持bigint unsigned类型、innodb引擎和索引,故需要为H2创建单独的schema,如下:
CREATE TABLE IF NOT EXISTS t_task
(
id int PRIMARY KEY AUTO_INCREMENT,
service_name text NOT NULL,
code text,
table_name text
);
3. 如何配置MariDB4j
MariDB4j的使用非常简单,以下基于Gradle进行说明。
步骤1:引入依赖包
testImplementation("ch.vorburger.mariaDB4j:mariaDB4j-springboot:2.4.0")
testImplementation("org.mariadb.jdbc:mariadb-java-client:2.5.3");
步骤2:配置MariaDB4j
在application-test.yaml中配置MariaDB4j:
# 配置Spring datasource
spring:
datasource:
url: jdbc:mariadb://localhost:3307/test
username: root
password:
name: test
driverClassName: or.mariadb.jdbc.Driver # mariadb的数据库驱动
mariaDB4j:
port: 3307 #为了避免与本地安装的MySQL端口冲突,将MariaDB的端口设置为3307
data: ./data #MariaDB的数据目录
步骤3:配置数据源
这里以手写数据源为例:
@Configuration
@Profile("test")
public class TestMariaDBConfig {
@Bean
public MariaDB4jSpringService mariaDB4jSpringService() {
return new MariaDB4jSpringService();
}
@Bean
public DataSource dataSource(MariaDB4jSpringService mariaDB4jSpringService,
@Value("${spring.datasource.name}" String databaseName,
@Value("${spring.datasource.username}" String userName,
@Value("${spring.datasource.password}" String password,
@Value("${spring.datasource.driverClassName}" String driver) {
mariaDB4jSpringService.getDB().createDB(databaseName);
DBConfigurationBuilder config = mariaDB4jSpringService.getConfiguration();
DataSource dataSource = DataSourceBuilder.create()
.username(userName)
.password(password)
.url(config.getURL(databaseName))
.driverClassName(driver)
.build();
// 配置Flyway
FluentConfiguration fluentConfiguration = new FluentConfiguration().dataSource(dataSource).locations("filesystem:src/main/resources/db/migration");
Flyway flyway = new Flyway(fluentConfiguration);
flyway.migrate(); #datasource初始化时会自动migration所有的schema
return dataSource;
}
}
4. 常见问题
- 问题1:Linux下无法启动,提示信息如下"Please consult the Knowledge to find out how to urn mysqld as root"
解决方案:为MariaDB添加配置参数"–user=root"
@Bean
public MariaDB4jSpringService mariaDB4jSpringService() {
return new MariaDB4jSpringService() {
@Override
public DBConfigurationBuilder getConfiguration() {
DBConfigurationBuilder builder = super.getConfiguration();
/**
* Linux下必须以root用户启动
* builder调用build()方法后再次调用addArg方法时会抛出异常
*/
if (!builder._getArgs().contains("--user=root")) {
builder.addArg("--user=root");
}
return builder;
}
};
}
-
问题2:MariaDB无法启动、无法连接、无法删除等【大多数问题都属于这类】
解决方案1:通过查看MariaDB的端口号,确认上一次启动的MariaDB进程是否关闭,若未关闭,则强制关闭,重新运行应用程序。
解决方案2:配置MariaDB使用随机端口号
mariaDB4j:
port: 0 #配置MariaDB启动时选择未使用的随机端口