整合 数据库

Netty-Boot 项目中,推荐使用 java-db 来进行数据库连接,它为开发者提供了简便的方式来操作数据库,支持多种数据库方言,并结合了 HikariCP 作为数据库连接池,确保高效的数据库连接管理。本文将展示如何配置 java-db 来连接 PostgreSQL 数据库,并进行简单的查询操作。

数据库连接原理

数据库连接在 Java 应用中至关重要,传统的 JDBC 连接方式虽然简单,但对于复杂的应用来说,手动管理连接、处理异常、以及 SQL 操作变得非常繁琐。java-db 提供了一套基于 ActiveRecord 的封装,使得数据库操作更加直观和简洁。

HikariCP 是 Java 生态中最受欢迎的数据库连接池之一,具备高效的连接管理机制,能够在高并发情况下保持性能和稳定性。结合 ActiveRecordPlugin,开发者可以通过简单的 API 进行增删改查操作,避免直接编写大量冗余的 SQL 语句。

工作流程

  1. 配置数据库连接:通过解析数据库的 Data Source Name (DSN) 字符串来获取数据库连接信息,如 URL、用户名、密码等。
  2. 连接池管理:使用 HikariCP 创建数据库连接池,管理连接的分配、回收和复用,确保在高并发环境下的连接性能。
  3. ActiveRecord 操作:通过 ActiveRecordPlugin,将数据库表映射为 Record 对象,开发者可以通过简单的 API 进行 CRUD 操作,而无需手动管理连接和构建 SQL。
  4. SQL 查询与执行:结合 Db 工具类,直接在代码中执行 SQL 查询,返回结果,并自动管理连接的生命周期。

连接数据库示例

1. 添加依赖

pom.xml 中添加 java-dbPostgreSQL 驱动以及 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 管理数据库连接池。通过 ActiveRecordPluginDb 工具类,开发者可以轻松进行数据库操作,而无需编写繁琐的 JDBC 代码。这一方案能够确保高效、稳定的数据库访问,特别适用于高并发的 Web 应用场景。