Skip to content

KingBaseES 连接管理

连接配置参数

核心连接参数

KingBaseES 的连接参数主要配置在 kingbase.conf 文件中,以下是一些核心连接参数:

sql
-- 最大连接数
max_connections = 1000

-- 超级用户保留连接数
superuser_reserved_connections = 10

-- 连接超时时间(毫秒)
connect_timeout = 10000

-- 客户端空闲超时时间
idle_in_transaction_session_timeout = 3600000

-- TCP 保活设置
tcp_keepalives_idle = 60
tcp_keepalives_interval = 10
tcp_keepalives_count = 10

-- 连接重试次数
connection_retry_count = 3
connection_retry_interval = 5000

连接参数调整

sql
-- 在线调整最大连接数
ALTER SYSTEM SET max_connections = 2000;

-- 在线调整空闲事务超时时间
ALTER SYSTEM SET idle_in_transaction_session_timeout = 1800000;

-- 重新加载配置
SELECT sys_reload_conf();

连接池管理

内置连接池配置

KingBaseES 提供了内置的连接池功能,可以通过以下参数配置:

sql
-- 启用内置连接池
shared_preload_libraries = 'sys_pool';

-- 连接池最大连接数
sys_pool.max_connections = 2000;

-- 连接池最小空闲连接数
sys_pool.min_idle = 50;

-- 连接池最大空闲连接数
sys_pool.max_idle = 200;

-- 连接池连接超时时间
sys_pool.connect_timeout = 5000;

-- 连接池空闲连接超时时间
sys_pool.idle_timeout = 3600000;

第三方连接池使用

除了内置连接池,KingBaseES 还支持使用第三方连接池,如 HikariCP、Druid 等。以下是使用 HikariCP 连接 KingBaseES 的配置示例:

java
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:kingbase8://localhost:54321/test");
config.setUsername("sysdba");
config.setPassword("password");
config.setMaximumPoolSize(200);
config.setMinimumIdle(20);
config.setIdleTimeout(3600000);
config.setConnectionTimeout(5000);
config.setMaxLifetime(1800000);
HikariDataSource ds = new HikariDataSource(config);

连接监控

连接状态监控

sql
-- 查看当前连接数统计
SELECT 
    state,
    count(*) AS connection_count
FROM 
    sys_stat_activity
GROUP BY 
    state;

-- 查看活跃连接详情
SELECT 
    datname,
    usename,
    application_name,
    client_addr,
    client_port,
    backend_start,
    state,
    query_start,
    query
FROM 
    sys_stat_activity
WHERE 
    state = 'active';

-- 查看空闲连接详情
SELECT 
    datname,
    usename,
    application_name,
    client_addr,
    backend_start,
    state,
    query_start,
    state_change
FROM 
    sys_stat_activity
WHERE 
    state = 'idle';

连接池监控

sql
-- 查看内置连接池状态
SELECT * FROM sys_pool_status;

-- 查看连接池统计信息
SELECT * FROM sys_pool_stats;

版本差异

特性V8 R6V8 R7
内置连接池支持支持,性能优化
连接状态监控基本支持增强支持,新增更多监控视图
连接池统计信息有限支持全面支持,新增详细统计视图
TCP 保活设置支持支持,新增更多参数

连接优化

连接数优化

  1. 评估合理的最大连接数

    • 计算公式:max_connections = (系统可用内存 - 共享内存) / 单个连接所需内存
    • 单个连接所需内存约为 10-20MB
  2. 使用连接池

    • 减少连接建立和销毁的开销
    • 控制并发连接数
    • 提高连接复用率
  3. 优化应用连接管理

    • 及时关闭不再使用的连接
    • 避免长时间占用连接
    • 使用连接池管理连接生命周期

连接性能优化

sql
-- 启用连接复用
ALTER SYSTEM SET reuse_connections = on;

-- 优化 TCP 配置
ALTER SYSTEM SET tcp_keepalives_idle = 30;
ALTER SYSTEM SET tcp_keepalives_interval = 5;
ALTER SYSTEM SET tcp_keepalives_count = 5;

-- 优化连接认证
ALTER SYSTEM SET password_encryption = 'scram-sha-256';
ALTER SYSTEM SET auth_delay.milliseconds = 0;

连接安全优化

sql
-- 限制特定用户的连接数
ALTER USER username CONNECTION LIMIT 100;

-- 限制特定数据库的连接数
ALTER DATABASE dbname CONNECTION LIMIT 500;

-- 启用连接审计
ALTER SYSTEM SET log_connections = on;
ALTER SYSTEM SET log_disconnections = on;
ALTER SYSTEM SET log_line_prefix = '%t %u %d %h ';

连接问题诊断

连接数超限

sql
-- 查看当前连接数
SELECT count(*) FROM sys_stat_activity;
SELECT current_setting('max_connections') AS max_connections;

-- 查看连接数使用情况
SELECT 
    datname,
    usename,
    count(*) AS connection_count
FROM 
    sys_stat_activity
GROUP BY 
    datname, usename
ORDER BY 
    connection_count DESC;

连接超时

sql
-- 查看连接超时相关参数
SELECT name, setting, unit FROM sys_settings WHERE name IN ('connect_timeout', 'idle_in_transaction_session_timeout');

-- 查看长时间运行的查询
SELECT 
    datname,
    usename,
    client_addr,
    query_start,
    now() - query_start AS query_duration,
    query
FROM 
    sys_stat_activity
WHERE 
    state = 'active'
ORDER BY 
    query_duration DESC
LIMIT 10;

连接泄露

sql
-- 查看空闲事务连接
SELECT 
    datname,
    usename,
    client_addr,
    backend_start,
    now() - backend_start AS session_duration,
    query
FROM 
    sys_stat_activity
WHERE 
    state = 'idle in transaction'
ORDER BY 
    session_duration DESC;

-- 终止长时间空闲事务连接
SELECT sys_terminate_backend(pid) FROM sys_stat_activity WHERE state = 'idle in transaction' AND now() - xact_start > interval '30 minutes';

最佳实践

  1. 合理设置最大连接数

    • 根据系统资源和业务需求设置合适的最大连接数
    • 预留 20-30% 的系统资源用于其他进程
  2. 使用连接池

    • 优先使用 KingBaseES 内置连接池或成熟的第三方连接池
    • 连接池大小设置为 CPU 核心数的 2-4 倍
  3. 监控连接状态

    • 定期监控连接数、连接状态和连接池性能
    • 设置连接数告警阈值(如最大连接数的 80%)
  4. 优化连接参数

    • 根据业务特点调整连接超时、空闲超时等参数
    • 启用 TCP 保活机制,及时释放无效连接
  5. 连接安全管理

    • 限制用户和数据库的最大连接数
    • 启用连接审计,记录连接和断开事件
    • 使用 SSL/TLS 加密连接
  6. 定期清理无效连接

    • 终止长时间空闲的连接
    • 清理长时间运行的无效查询

常见问题 (FAQ)

Q: 如何确定合理的最大连接数?

A: 最大连接数的设置需要考虑以下因素:

  • 系统可用内存:单个连接约占用 10-20MB 内存
  • CPU 核心数:连接数过多会导致 CPU 上下文切换频繁
  • 磁盘 I/O 能力:大量并发连接会增加磁盘 I/O 压力
  • 业务需求:根据应用的并发用户数和请求频率

建议计算公式:max_connections = (系统可用内存 - 共享内存) / 单个连接所需内存,并结合实际压测结果调整。

Q: 连接池大小设置多少合适?

A: 连接池大小的设置原则:

  • 对于 OLTP 应用,连接池大小建议设置为 CPU 核心数的 2-4 倍
  • 对于 OLAP 应用,连接池大小建议设置为 CPU 核心数的 1-2 倍
  • 避免设置过大的连接池大小,否则会导致资源竞争和性能下降

Q: 如何处理连接泄露问题?

A: 连接泄露的处理方法:

  1. 检查应用代码,确保连接使用后正确关闭
  2. 配置连接池的空闲超时和最大生命周期
  3. 启用 KingBaseES 的 idle_in_transaction_session_timeout 参数
  4. 定期监控和清理长时间空闲的连接
  5. 使用连接池的监控功能,及时发现连接泄露问题

Q: 如何优化连接建立速度?

A: 优化连接建立速度的方法:

  1. 使用连接池,减少连接建立和销毁的开销
  2. 启用连接复用功能
  3. 优化 TCP 配置,减少 TCP 握手时间
  4. 使用更快的认证方式(如 scram-sha-256)
  5. 调整 connect_timeout 参数,避免过长的连接等待

Q: 如何监控连接性能?

A: 连接性能监控的关键点:

  1. 监控连接数变化趋势
  2. 监控连接状态分布(活跃、空闲、空闲事务等)
  3. 监控连接建立和关闭的频率
  4. 监控连接池的命中率和等待时间
  5. 监控长时间运行的查询和事务

Q: 不同版本的连接管理有什么差异?

A: V8 R7 相比 V8 R6 在连接管理方面的改进:

  1. 内置连接池性能优化
  2. 新增更多连接监控视图
  3. 增强连接池统计信息
  4. 优化 TCP 保活设置
  5. 新增动态调整连接参数的功能

案例分析

案例:某电商平台连接数过高问题

背景:某电商平台 KingBaseES 数据库的连接数经常达到最大值 1000,导致新连接无法建立,影响业务正常运行。

问题分析

  1. 应用使用了大量短连接,连接建立和销毁频繁
  2. 连接池配置不合理,最大连接数设置过大
  3. 部分连接长时间处于空闲事务状态

解决方案

  1. 优化应用代码,使用长连接和连接池
  2. 调整连接池参数,将最大连接数从 1000 调整为 200
  3. 设置 idle_in_transaction_session_timeout = 300000(5分钟)
  4. 启用 TCP 保活机制,及时释放无效连接
  5. 定期监控连接状态,清理长时间空闲的连接

效果

  • 连接数稳定在 100-150 之间
  • 连接建立时间从平均 50ms 降低到 5ms
  • 数据库 CPU 使用率从 80% 降低到 40%
  • 业务系统响应时间缩短 50%

案例:某金融系统连接泄露问题

背景:某金融系统 KingBaseES 数据库的连接数持续增长,最终达到最大值,导致系统无法正常提供服务。

问题分析

  1. 应用代码存在连接泄露,部分连接使用后未正确关闭
  2. 连接池的最大生命周期设置过长
  3. 未启用连接超时机制

解决方案

  1. 修复应用代码,确保连接使用后正确关闭
  2. 调整连接池参数:
    • max_lifetime = 1800000(30分钟)
    • idle_timeout = 3600000(1小时)
  3. 启用 KingBaseES 的 idle_in_transaction_session_timeout 参数
  4. 配置连接池的监控告警,及时发现连接泄露问题

效果

  • 连接数稳定在合理范围
  • 连接泄露问题得到彻底解决
  • 系统可用性提升到 99.99%
  • 运维成本降低 50%

通过合理的连接管理配置和优化,可以有效提高 KingBaseES 数据库的性能和可用性,避免连接相关的问题影响业务运行。DBA 需要根据业务特点和系统资源情况,不断调整和优化连接参数,确保数据库连接的高效利用。