数据源配置
从本章开始介绍Quarkus的数据库操作,本章主要讲一下在Quarkus中如何配置数据库,单数据库多数据库或者多异构数据库配置等等。虽然上一个部分的Rest服务还没有讲完,还有一些不常用的框架没有写到,后面慢慢完善。
本章目标
- 单数据源配置
- 多数据源配置
- 响应式数据源配置
1 基本配置
1.1 配置
Quarkus 支持两种数据源配置:
- JDBC: JDBC数据源使用的连接池是 Agroal。
- Reactive : 使用的Vert.x的数据库驱动实现。
JDBC的配置如下:
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=<your username>
quarkus.datasource.password=<your password>
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/hibernate_orm_test
quarkus.datasource.jdbc.max-size=16
Reactive 数据源的配置如下:
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=<your username>
quarkus.datasource.password=<your password>
quarkus.datasource.reactive.url=postgresql:///your_database
quarkus.datasource.reactive.max-size=20
两者在配置方面并没有太大的区别,只是在数据源的配置前面加上了reactive标识。
- db-kind : 配置的是你要链接的数据库的名称,默认支持的DB类型如下:
DB2: db2
Derby: derby
H2: h2
MariaDB: mariadb
Microsoft SQL Server: mssql
MySQL: mysql
PostgreSQL: postgresql, pgsql or pg
如果想使用不在内置数据库类型中的数据库,只能使用JVM模式,需要配置db-kind=other
,且需要指明Driver驱动。
对于内置数据库使用的Driver可以参考下图:
默认情况下不需要我们显示配置,但如果需要指定Driver可以加如下配置项:
quarkus.datasource.jdbc.driver=io.opentracing.contrib.jdbc.TracingDriver
更多配置项可以参考 https://quarkus.io/guides/datasource#jdbc-configuration
1.2 使用
加入依赖,这里我使用PG
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-jdbc-postgresql</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-agroal</artifactId>
</dependency>
基本使用: 只需要注入AgroalDatasource 使用即可。
@ApplicationScoped
public class DbOperationService {
@Inject
AgroalDataSource agroalDataSource;
public String getById(Integer id){
try {
Connection connection = agroalDataSource.getConnection();
var sql = "select * from t_user where id = ?";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, id);
ResultSet resultSet = statement.executeQuery();
if(resultSet.next()){
var idd = resultSet.getInt(1);
var name = resultSet.getString(2);
return idd + ", " + name;
}
}catch (Exception e){
e.printStackTrace();
}
return "nothing";
}
}
就是使用原生JDBC模式,不常用。
1.3 响应式数据库的使用
加入依赖:
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-reactive-pg-client</artifactId>
</dependency>
@ApplicationScoped
public class DbReactiveOperationService {
@Inject
@ReactiveDataSource("re")
PgPool pgPool;
public Uni<String> getById(Integer id){
return pgPool.preparedQuery("select * from t_user where id = $1").execute(Tuple.of(id))
.onItem()
.transform(rows -> {
var res = rows.iterator().next();
var idd = res.getInteger("id");
var name = res.getString("name");
return idd + ", " + name;
}).onFailure()
.recoverWithItem(e->{
e.printStackTrace();
return "ERROR";
});
}
}
1.4 多数据配置和使用
quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=postgres
quarkus.datasource.password=postgres
quarkus.datasource.jdbc.url=jdbc:postgresql://192.168.199.125:5432/quarkus_demo
quarkus.datasource.jdbc.max-size=16
quarkus.datasource.pg.db-kind=postgresql
quarkus.datasource.pg.username=postgres
quarkus.datasource.pg.password=postgres
quarkus.datasource.pg.jdbc.url=jdbc:postgresql://192.168.199.125:5432/quarkus_demo
quarkus.datasource.pg.jdbc.max-size=16
quarkus.datasource.my.db-kind=postgresql
quarkus.datasource.my.username=postgres
quarkus.datasource.my.password=postgres
quarkus.datasource.my.jdbc.url=jdbc:postgresql://192.168.199.125:5432/quarkus_demo
quarkus.datasource.my.jdbc.max-size=16
@Inject
@DataSource("pg")
AgroalDataSource agroalDataSource;
@Inject
@DataSource("my")
AgroalDataSource mysql;
响应式数据源的配置类似但是在使用时使用的是@ReactiveDatasource
注解指定要使用的数据源。
2 总结
本节简单介绍了在Quarkus中如何配置多数据源,仅仅是一些配置,具体的使用方式会在后面的文章中慢慢讲到。