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