You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Hyperdrive+Neon+Drizzle无法复用连接,需每次查询新建实例求助

解决方案:在Hono请求生命周期内复用Drizzle连接

你的问题核心是同一个请求/Worker执行流程中重复创建Drizzle实例,本质是没有在请求上下文内复用已初始化的连接。结合Hono的中间件机制,可以实现单请求内的连接复用,无需每次查询都新建。

步骤1:编写DB初始化中间件

通过Hono中间件在请求启动时初始化一次DB连接,并挂载到请求上下文,后续所有路由都从上下文复用该实例:

import { MiddlewareHandler } from 'hono';
import { drizzle } from 'drizzle-orm/node-postgres';
import { Client, ClientConfig } from 'pg';

export const dbMiddleware: MiddlewareHandler = async (c, next) => {
  // 避免重复初始化
  if (!c.get('db')) {
    const clientConfig: ClientConfig = {
      connectionString: c.env.HYPERDRIVE.connectionString,
      keepAlive: true,
    };

    const client = new Client(clientConfig);
    await client.connect();
    const db = drizzle({ client });

    // 将DB实例挂载到请求上下文
    c.set('db', db);

    // 请求结束后自动关闭连接,符合Worker生命周期
    c.on('finish', async () => {
      await client.end();
    });
  }
  await next();
};

步骤2:全局注册中间件并复用实例

在Hono应用中全局注册中间件,后续路由直接从上下文获取DB实例执行多次查询:

import { Hono } from 'hono';
import { dbMiddleware } from './middlewares/db';
// 导入你的Drizzle schema
import { usersTable } from './schema';
import { sql } from 'drizzle-orm';

const app = new Hono();

// 全局生效,所有路由均可复用DB实例
app.use('*', dbMiddleware);

app.get('/api/users', async (c) => {
  const db = c.get('db');
  
  // 同一个请求内复用同一个DB实例执行多次查询
  const userList = await db.select().from(usersTable);
  const userCount = await db.select({ count: sql`count(*)` }).from(usersTable);

  return c.json({
    users: userList,
    total: userCount[0].count
  });
});

export default app;

关键说明

  1. 单请求内复用:中间件会在请求开始时初始化一次DB连接,整个请求生命周期内所有路由都复用该实例,避免重复创建连接的开销。
  2. Worker生命周期适配:通过c.on('finish')在请求结束后自动关闭连接,符合Cloudflare Workers的无状态特性,不会导致连接泄漏。
  3. Hyperdrive兼容:Hyperdrive的connectionString在单请求内是有效的,复用连接不会出现权限或有效性问题。

内容的提问来源于stack exchange,提问作者letincho5

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:56:11