跳到主要内容

4.2 Solon 完整集成

Maven 依赖

<dependency>
<groupId>top.dlzio</groupId>
<artifactId>dlz-db-solon-plugin</artifactId>
<version>7.0.0</version>
</dependency>

插件通过 Solon SPI 自动加载,无需手动配置 Plugin 类

配置数据源

使用 Solon 原生数据源配置方式:

# app.yml
datasource:
default:
jdbcUrl: jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver

多数据源配置:

datasource:
default:
jdbcUrl: jdbc:mysql://localhost:3306/db_default
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
slave:
jdbcUrl: jdbc:mysql://localhost:3306/db_slave
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver
report:
jdbcUrl: jdbc:mysql://localhost:3306/db_report
username: root
password: 123456
driverClassName: com.mysql.cj.jdbc.Driver

配置 DLZ-DB

dlz:
db:
# 逻辑删除字段名
logic-delete-field: is_deleted
# 预设 SQL 文件路径(classpath 下的通配符路径)
sqllist:
- app/*
# 是否使用数据库的 SQL(预设 SQL 存储在数据库表中)
use-db-sql: false
# 日志配置
log:
show-result: false
show-run-sql: true
show-caller: true
slow-sql-threshold: 1000 #慢sql警告 ms
# 自动建表
helper:
auto-update: true
package-name: com.example.entity
# 表结构缓存时间(毫秒,-1 表示不过期)
table-cache-time: -1

开始使用

DB.Pojo/DB.Table/DB.Jdbc/DB.Sql 等核心 API 与 Spring Boot 版本完全一致:

@Component
public class UserService {
public List<User> getActiveUsers() {
return DB.Pojo.select(User.class)
.eq(User::getStatus, 1)
.orderByDesc(User::getCreateTime)
.queryBeanList();
}
}

事务控制

声明式事务(推荐)

使用 Solon 的 @Tran 注解:

import org.noear.solon.annotation.Tran;

@Component
public class OrderService {

@Tran
public void createOrder(Order order, List<OrderItem> items) {
DB.Pojo.insert(order);
Long orderId = order.getId();

items.forEach(item -> {
item.setOrderId(orderId);
DB.Pojo.insert(item);
});
}
}

编程式事务

使用 DB.Tx.run()

// 默认数据源事务
DB.Tx.run(() -> {
DB.Pojo.insert(user);
DB.Pojo.insert(userLog);
});

// 指定数据源事务
DB.Tx.run("slave", () -> {
DB.Pojo.insert(user);
DB.Pojo.insert(userLog);
});

// 带返回值
Long id = DB.Tx.run(() -> {
DB.Pojo.insert(user);
return user.getId();
});

事务说明

Solon 插件的事务基于自研 ConnectionHolder 实现,支持 PROPAGATION_REQUIRED 语义:

  • 外层已有事务则复用连接
  • 内层异常透传给外层
  • 异常时自动回滚,包装为 DbException 抛出

注意:Solon 版暂不支持 REQUIRES_NEW / NESTED 等传播行为。

数据源管理

动态注册数据源

DataSourceProperty prop = new DataSourceProperty();
prop.setName("test");
prop.setUrl("jdbc:mysql://localhost:3306/db_test");
prop.setUsername("root");
prop.setPassword("123456");
prop.setMaxPoolSize(10);
prop.setMinIdle(2);

DB.Dynamic.setDataSource(prop);

切换数据源

// 切换到从库查询
List<User> users = DB.Dynamic.use("slave", () ->
DB.Pojo.select(User.class)
.eq(User::getStatus, 1)
.queryBeanList()
);

// 切换到报表库
List<ResultMap> report = DB.Dynamic.use("report", () ->
DB.Jdbc.select("SELECT * FROM daily_report").queryList()
);

设置默认数据源

// Solon 插件启动时会自动注册名为 default 的数据源
// 如需手动替换:
DB.Dynamic.setDefaultDataSource(yourDataSource);

Redis 缓存

当项目中存在 JedisPool 时,Solon 插件会自动构建 ICacheExecutor 实现。

# Redis 配置(可选)
redis:
server: localhost:6379
password: 123456
db: 0

无 Redis 时,缓存执行器默认为 NoOp 实现,不影响正常使用。

常见问题

Q1:Solon 版本的 API 和 Spring Boot 版本完全一样吗?

是的。所有 DB.xxx 核心 API 完全一致,代码可无缝迁移。

Q2:事务注解用 @Transactional 还是 @Tran

Solon 下使用 @Tran@Transactional 是 Spring 注解,Solon 不支持。

Q3:数据源配置方式为什么和 Spring Boot 不同?

Solon 使用自己的 datasource.* 配置前缀,是 Solon 框架的原生方式。DLZ-DB 插件会自动读取并注册数据源。

Q4:支持哪些数据库?

与核心模块一致,支持 MySQL、PostgreSQL、Oracle、达梦等。

项目结构参考

my-solon-app/
├── pom.xml # 引入 dlz-db-solon-plugin
├── src/
│ ├── main/
│ │ ├── java/com/example/
│ │ │ ├── entity/
│ │ │ │ └── User.java # 实体类
│ │ │ ├── service/
│ │ │ │ └── UserService.java # 直接使用 DB.xxx
│ │ │ └── App.java # Solon 启动类
│ │ └── resources/
│ │ ├── app.yml # 数据源和 DLZ-DB 配置
│ │ └── sql/
│ │ └── app/
│ │ └── user.sql # 预设 SQL 文件
│ └── test/
│ └── java/com/example/
│ └── UserServiceTest.java