整合 数据库
在 Netty-Boot
项目中,推荐使用 java-db
来进行数据库连接,它为开发者提供了简便的方式来操作数据库,支持多种数据库方言,并结合了 HikariCP
作为数据库连接池,确保高效的数据库连接管理。本文将展示如何配置 java-db
来连接 PostgreSQL 数据库,并进行简单的查询操作。
数据库连接原理
数据库连接在 Java 应用中至关重要,传统的 JDBC 连接方式虽然简单,但对于复杂的应用来说,手动管理连接、处理异常、以及 SQL 操作变得非常繁琐。java-db
提供了一套基于 ActiveRecord 的封装,使得数据库操作更加直观和简洁。
HikariCP
是 Java 生态中最受欢迎的数据库连接池之一,具备高效的连接管理机制,能够在高并发情况下保持性能和稳定性。结合 ActiveRecordPlugin
,开发者可以通过简单的 API 进行增删改查操作,避免直接编写大量冗余的 SQL 语句。
工作流程
- 配置数据库连接:通过解析数据库的 Data Source Name (DSN) 字符串来获取数据库连接信息,如 URL、用户名、密码等。
- 连接池管理:使用
HikariCP
创建数据库连接池,管理连接的分配、回收和复用,确保在高并发环境下的连接性能。 - ActiveRecord 操作:通过
ActiveRecordPlugin
,将数据库表映射为 Row 对象,开发者可以通过简单的 API 进行 CRUD 操作,而无需手动管理连接和构建 SQL。 - SQL 查询与执行:结合
Db
工具类,直接在代码中执行 SQL 查询,返回结果,并自动管理连接的生命周期。
连接数据库示例
1. 添加依赖
在 pom.xml
中添加 java-db
、PostgreSQL
驱动以及 HikariCP
依赖:
<dependency>
<groupId>com.litongjava</groupId>
<artifactId>java-db</artifactId>
<version>${java-db.version}</version>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.2.24</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>4.0.3</version>
</dependency>
2. 添加数据库配置
在环境变量或 .env
配置文件中添加数据库连接信息:
DATABASE_DSN=postgresql://doadmin:123456@127.0.0.1:15432/defaultdb
jdbc.MaximumPoolSize=20
jdbc.showSql=true
DATABASE_DSN
:数据库连接字符串,格式为protocol://user:password@host:port/database
。jdbc.showSql
:是否在控制台显示执行的 SQL 语句,便于开发和调试。
3. 配置数据库连接池和 ActiveRecord
创建数据库配置类 ImDbConfig
,初始化 HikariCP
连接池和 ActiveRecordPlugin
:
package com.litongjava.study.netty.boot.config;
import com.jfinal.template.Engine;
import com.jfinal.template.source.ClassPathSourceFactory;
import com.litongjava.annotation.AConfiguration;
import com.litongjava.annotation.AInitialization;
import com.litongjava.db.activerecord.ActiveRecordPlugin;
import com.litongjava.db.activerecord.OrderedFieldContainerFactory;
import com.litongjava.db.activerecord.dialect.PostgreSqlDialect;
import com.litongjava.db.hikaricp.HikariCpPlugin;
import com.litongjava.hook.HookContainer;
import com.litongjava.model.dsn.JdbcInfo;
import com.litongjava.tio.utils.dsn.DbDSNParser;
import com.litongjava.tio.utils.environment.EnvUtils;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@AConfiguration
public class ImDbConfig {
@Initialization
public void config() {
// 获取数据库连接信息
String dsn = EnvUtils.getStr("DATABASE_DSN");
JdbcInfo jdbc = new DbDSNParser().parse(dsn);
// 初始化 HikariCP 数据库连接池
HikariCpPlugin hikariCpPlugin = new HikariCpPlugin(jdbc.getUrl(), jdbc.getUser(), jdbc.getPswd());
int maximumPoolSize = EnvUtils.getInt("jdbc.MaximumPoolSize", 10);
hikariCpPlugin.setMaximumPoolSize(maximumPoolSize);
hikariCpPlugin.start();
// 初始化 ActiveRecordPlugin
ActiveRecordPlugin arp = new ActiveRecordPlugin(hikariCpPlugin);
// 开发环境下启用开发模式
if (EnvUtils.isDev()) {
arp.setDevMode(true);
}
// 是否展示 SQL
boolean showSql = EnvUtils.getBoolean("jdbc.showSql", true);
log.info("show sql:{}", showSql);
arp.setShowSql(showSql);
arp.setDialect(new PostgreSqlDialect());
arp.setContainerFactory(new OrderedFieldContainerFactory());
// 配置引擎
Engine engine = arp.getEngine();
engine.setSourceFactory(new ClassPathSourceFactory());
engine.setCompressorOn(' ');
engine.setCompressorOn('\n');
arp.start();
// 添加关闭钩子,应用关闭时释放资源
HookContainer.me().addDestroyMethod(arp::stop);
}
}
4. 测试数据库连接
创建 TestHandler
,通过 Db.queryInt()
直接执行 SQL 查询并返回结果:
package com.litongjava.study.netty.boot.handler;
import com.litongjava.db.activerecord.Db;
import com.litongjava.netty.boot.utils.HttpResponseUtils;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.http.FullHttpRequest;
import io.netty.handler.codec.http.FullHttpResponse;
public class TestHandler {
public FullHttpResponse test(ChannelHandlerContext ctx, FullHttpRequest httpRequest) {
Integer value = Db.queryInt("select 1");
return HttpResponseUtils.txt(value + "");
}
}
将 TestHandler
注册到 HTTP 请求路由中,访问 /test
时执行查询:
TestHandler testHandler = Aop.get(TestHandler.class);
httpRequestRouter.add("/test", testHandler::test);
5. 验证效果
启动 Netty 服务,访问 http://localhost/im/test
,返回结果应为 1
,表示数据库查询执行成功。
总结
通过以上步骤,我们成功在 Netty-Boot
项目中整合了 java-db
来连接 PostgreSQL 数据库,并使用 HikariCP
管理数据库连接池。通过 ActiveRecordPlugin
和 Db
工具类,开发者可以轻松进行数据库操作,而无需编写繁琐的 JDBC 代码。这一方案能够确保高效、稳定的数据库访问,特别适用于高并发的 Web 应用场景。