WebSphere教程FG024-WebSphere数据源连接池优化与实战
本文档风哥主要介绍WebSphere Application Server 9.0.5的数据源连接池优化,包括连接池参数配置、性能优化、监控告警等内容,风哥教程参考WebSphere官方文档数据源章节,适合WebSphere管理员在学习和测试中使用,如果要应用于生产环境则需要自行确认。更多视频教程www.fgedu.net.cn
Part01-基础概念与理论知识
1.1 连接池概述
数据源连接池是管理数据库连接的缓存机制,通过复用连接提高性能。学习交流加群风哥微信: itpux-com
- 性能提升:减少连接创建开销
- 资源复用:复用数据库连接
- 连接管理:统一管理连接生命周期
- 流量控制:限制最大连接数
1.1.1 连接池架构
┌─────────────────────────────────────────────────────────┐
│ 连接池架构 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 应用层 │ │
│ │ 应用代码 → getConnection() → 使用连接 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 连接池 │ │
│ │ ┌─────┐ ┌─────┐ ┌─────┐ ┌─────┐ │ │
│ │ │连接1│ │连接2│ │连接3│ │连接N│ │ │
│ │ └─────┘ └─────┘ └─────┘ └─────┘ │ │
│ │ ↑ 获取 ↓ 归还 │ │
│ └─────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 数据库 │ │
│ │ Oracle / MySQL / PostgreSQL │ │
│ └─────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘
# 连接池工作流程
1. 获取连接
应用请求 → 检查空闲连接 → 有空闲连接?
├─ 是 → 返回空闲连接
└─ 否 → 创建新连接(未达上限)或等待
2. 使用连接
应用使用连接 → 执行SQL → 获取结果
3. 归还连接
应用关闭连接 → 连接归还池 → 标记为空闲
# 连接池类型
类型 描述 适用场景
──────────────────────────────────────────────────────
容器管理 WebSphere管理 企业应用
应用管理 应用自己管理 特殊需求
第三方池 HikariCP等 高性能需求
1.2 连接池参数
连接池参数介绍:
1.2.1 核心参数
1. 连接数量参数
参数 默认值 说明
──────────────────────────────────────────────────────
最小连接数 1 池中最少保持的连接数
最大连接数 10 池中最大连接数
连接增长数 1 每次增长的连接数
2. 超时参数
参数 默认值 说明
──────────────────────────────────────────────────────
连接超时 1800秒 连接最大空闲时间
等待超时 180秒 获取连接等待时间
废弃超时 300秒 废弃连接超时时间
3. 验证参数
参数 默认值 说明
──────────────────────────────────────────────────────
测试连接 false 使用前测试连接
验证SQL null 验证连接的SQL
测试空闲连接 false 定期测试空闲连接
4. 高级参数
参数 默认值 说明
──────────────────────────────────────────────────────
预取大小 10 预取的行数
语句缓存大小 0 语句缓存数量
重试间隔 0 重试间隔时间
# 参数计算公式
1. 最大连接数计算
最大连接数 = 并发用户数 × 每用户连接数 × 峰值系数
示例:
并发用户:100
每用户连接:1
峰值系数:1.5
最大连接数 = 100 × 1 × 1.5 = 150
2. 最小连接数计算
最小连接数 = 平均并发用户数 × 每用户连接数
示例:
平均并发:20
每用户连接:1
最小连接数 = 20 × 1 = 20
# 数据库最大连接限制
数据库 最大连接数 建议值
──────────────────────────────────────────────────────
Oracle 由processes参数控制 300-500
MySQL 由max_connections控制 500-1000
PostgreSQL 由max_connections控制 200-500
注意:所有应用连接池的最大连接数之和不能超过数据库最大连接数
1.3 优化策略
连接池优化策略:
1.3.1 优化方法
1. 连接数优化
策略 说明
──────────────────────────────────────────────────────
最小连接数 设置为平均并发数
最大连接数 设置为峰值并发数×1.5
连接增长 设置为合理的增长步长
2. 超时优化
策略 说明
──────────────────────────────────────────────────────
连接超时 根据业务特点设置
等待超时 避免过长等待
废弃超时 及时清理废弃连接
3. 验证优化
策略 说明
──────────────────────────────────────────────────────
测试连接 启用,确保连接可用
验证SQL 使用简单的SQL
测试间隔 合理设置测试间隔
4. 性能优化
策略 说明
──────────────────────────────────────────────────────
语句缓存 启用语句缓存
预取优化 设置合适的预取大小
连接复用 确保连接正确关闭
# 优化配置示例
# 高并发场景配置
最小连接数:50
最大连接数:200
连接超时:1800秒
等待超时:60秒
测试连接:true
验证SQL:SELECT 1 FROM DUAL
语句缓存:100
# 低并发场景配置
最小连接数:5
最大连接数:20
连接超时:3600秒
等待超时:120秒
测试连接:true
验证SQL:SELECT 1 FROM DUAL
语句缓存:20
1.4 监控指标
连接池监控指标:
1.4.1 关键指标
1. 使用率指标
指标 说明 告警阈值
──────────────────────────────────────────────────────
活动连接数 当前使用的连接数 > 80%最大值
空闲连接数 当前空闲的连接数 < 20%最小值
连接使用率 活动连接/最大连接 > 80%
2. 性能指标
指标 说明 告警阈值
──────────────────────────────────────────────────────
获取连接时间 获取连接的平均时间 > 100ms
等待线程数 等待获取连接的线程数 > 10
连接创建数 新创建的连接数 异常增长
3. 错误指标
指标 说明 告警阈值
──────────────────────────────────────────────────────
连接失败数 获取连接失败的次数 > 0
连接泄漏数 未关闭的连接数 > 0
连接超时数 连接超时的次数 > 0
# 监控命令
# 通过wsadmin获取连接池状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 获取数据源统计
ds = AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’)
AdminControl.getAttribute(ds, ‘stats’)
# 输出示例
{
“activeConnections”: 45,
“freeConnections”: 55,
“totalConnections”: 100,
“waitingThreads”: 0,
“averageGetTime”: 5
}
Part02-生产环境规划与建议
2.1 连接池规划
连接池规划:
2.1.1 规划策略
1. 业务分析
分析项 内容
──────────────────────────────────────────────────────
并发用户数 业务高峰期并发用户
请求频率 每秒请求数
事务时长 单个事务平均时长
数据库类型 Oracle/MySQL等
2. 容量估算
场景 并发用户 连接数估算
──────────────────────────────────────────────────────
小型应用 50 25-50
中型应用 200 100-200
大型应用 500 250-500
超大型应用 1000+ 500-1000
3. 多数据源规划
数据源 用途 连接池大小
──────────────────────────────────────────────────────
主数据源 业务数据 较大
只读数据源 查询 中等
日志数据源 日志记录 较小
缓存数据源 缓存操作 中等
# 连接池规划模板
项目名称:fgedu生产环境连接池规划
业务特点:
– 并发用户:200
– 请求频率:100 TPS
– 事务时长:200ms
– 数据库:Oracle 19c
规划方案:
┌─────────────────────────────────────────────────────────┐
│ 连接池配置 │
├─────────────────────────────────────────────────────────┤
│ 数据源:fgedudb │
│ │
│ 连接数配置: │
│ – 最小连接数:30 │
│ – 最大连接数:100 │
│ – 连接增长:10 │
│ │
│ 超时配置: │
│ – 连接超时:1800秒 │
│ – 等待超时:60秒 │
│ – 废弃超时:300秒 │
│ │
│ 验证配置: │
│ – 测试连接:是 │
│ – 验证SQL:SELECT 1 FROM DUAL │
│ – 测试间隔:60秒 │
└─────────────────────────────────────────────────────────┘
2.2 容量规划
容量规划:
2.2.1 容量计算
1. 连接数计算
公式:
最大连接数 = 并发用户 × 每用户连接 × 峰值系数 × 冗余系数
参数说明:
– 并发用户:高峰期并发用户数
– 每用户连接:每个用户平均连接数(通常为1)
– 峰值系数:考虑突发流量(1.2-1.5)
– 冗余系数:考虑冗余(1.1-1.2)
示例计算:
并发用户:200
每用户连接:1
峰值系数:1.3
冗余系数:1.1
最大连接数 = 200 × 1 × 1.3 × 1.1 = 286 ≈ 300
2. 数据库连接限制
数据库配置 建议值
──────────────────────────────────────────────────────
Oracle processes 总连接数 + 50
MySQL max_connections 总连接数 + 100
3. 多应用共享
如果多个应用共享数据库:
数据库最大连接 = 应用1最大连接 + 应用2最大连接 + … + 预留
# 容量规划脚本
#!/bin/bash
# pool_sizing.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
CONCURRENT_USERS=$1
PEAK_FACTOR=1.3
REDUNDANCY=1.1
if [ -z “$CONCURRENT_USERS” ]; then
echo “用法: $0 并发用户数”
exit 1
fi
MAX_CONNECTIONS=$(echo “scale=0; $CONCURRENT_USERS * 1 * $PEAK_FACTOR * $REDUNDANCY” | bc)
MAX_CONNECTIONS=$((MAX_CONNECTIONS + 1))
MIN_CONNECTIONS=$((CONCURRENT_USERS / 2))
echo “=== 连接池容量规划 ===”
echo “并发用户数:$CONCURRENT_USERS”
echo “峰值系数:$PEAK_FACTOR”
echo “冗余系数:$REDUNDANCY”
echo “”
echo “推荐配置:”
echo “最小连接数:$MIN_CONNECTIONS”
echo “最大连接数:$MAX_CONNECTIONS”
echo “数据库最大连接:$((MAX_CONNECTIONS + 50))”
执行结果:
./pool_sizing.sh 200
=== 连接池容量规划 ===
并发用户数:200
峰值系数:1.3
冗余系数:1.1
推荐配置:
最小连接数:100
最大连接数:287
数据库最大连接:337
2.3 测试规划
测试规划:
2.3.1 测试策略
1. 功能测试
测试项 测试内容 通过标准
──────────────────────────────────────────────────────
连接获取 正常获取连接 获取成功
连接使用 正常执行SQL 执行成功
连接归还 正常关闭连接 归还成功
连接验证 连接有效性验证 验证通过
2. 性能测试
测试项 测试内容 通过标准
──────────────────────────────────────────────────────
获取连接时间 获取连接耗时 < 50ms
并发获取 并发获取连接 无等待
连接复用 连接复用率 > 90%
3. 压力测试
测试项 测试内容 通过标准
──────────────────────────────────────────────────────
最大连接 达到最大连接数 正常处理
连接等待 超过最大连接 正确等待
连接回收 连接回收机制 正确回收
# 测试脚本
#!/bin/bash
# pool_test.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== 连接池测试 ===”
# 1. 连接获取测试
echo “1. 连接获取测试:”
for i in {1..10}; do
start=$(date +%s%N)
# 执行获取连接操作
end=$(date +%s%N)
echo “第${i}次获取连接耗时:$((($end – $start) / 1000000))ms”
done
# 2. 并发测试
echo “”
echo “2. 并发测试:”
for i in {1..50}; do
curl -s http://localhost:9080/fgedu-app/db/test &
done
wait
echo “”
echo “=== 测试完成 ===”
2.4 告警规划
告警规划:
2.4.1 告警策略
1. 告警指标
指标 告警阈值 级别
──────────────────────────────────────────────────────
连接使用率 > 80% 警告
连接使用率 > 95% 严重
等待线程数 > 5 警告
等待线程数 > 10 严重
获取连接时间 > 100ms 警告
连接失败数 > 0 严重
2. 告警脚本
#!/bin/bash
# pool_alert.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
ALERT_THRESHOLD=80
# 获取连接池状态
STATUS=$(/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “ds=AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’); print AdminControl.getAttribute(ds, ‘stats’)” \
2>/dev/null)
# 解析活动连接数和最大连接数
ACTIVE=$(echo $STATUS | grep -o ‘”activeConnections”: [0-9]*’ | grep -o ‘[0-9]*’)
MAX=$(echo $STATUS | grep -o ‘”totalConnections”: [0-9]*’ | grep -o ‘[0-9]*’)
# 计算使用率
USAGE=$((ACTIVE * 100 / MAX))
echo “连接使用率:$USAGE%”
if [ $USAGE -gt $ALERT_THRESHOLD ]; then
echo “告警:连接使用率超过阈值 $ALERT_THRESHOLD%”
# 发送告警
echo “连接池告警” | mail -s “WebSphere连接池告警” admin@fgedu.net.cn
fi
3. 监控集成
# Prometheus监控配置
– job_name: ‘websphere-datasource’
static_configs:
– targets: [‘fgedu.net.cn:9080’]
metrics_path: /metrics
Part03-生产环境项目实施方案
3.1 连接池配置实战
连接池配置操作:
3.1.1 创建数据源
1. 通过控制台配置
步骤:
1. 登录管理控制台
2. 导航到 资源 > JDBC > 数据源
3. 选择作用域
4. 点击”新建”
5. 输入数据源名称:fgedudb
6. 输入JNDI名称:jdbc/fgedudb
7. 选择JDBC提供者
8. 配置数据库连接信息
9. 配置连接池参数
10. 测试连接
11. 保存配置
2. 通过wsadmin配置
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 创建JDBC提供者
AdminJDBC.createJDBCProvider(‘[-scope Cell -databaseType Oracle -providerType “Oracle JDBC Driver” -implementationType “Connection pool data source” -name fgeduOracleProvider -classpath [/WebSphere/jdbc/ojdbc8.jar]]’)
# 创建数据源
AdminJDBC.createDataSource(‘[-name fgedudb -jndiName jdbc/fgedudb -dataStoreHelperClassName com.ibm.websphere.rsadapter.Oracle11gDataStoreHelper -containerManagedPersistence true -configureResourceProperties [[databaseName fgedudb] [driverType 4] [serverName db.fgedu.net.cn] [portNumber 1521]] -componentManagedAuthenticationAlias fgeduCell01/fgedudb_user]’)
AdminConfig.save()
# 配置连接池
ds = AdminConfig.getid(‘/DataSource:fgedudb/’)
cp = AdminConfig.list(‘ConnectionPool’, ds)
# 设置连接池参数
AdminConfig.modify(cp, ‘[[minConnections 30] [maxConnections 100] [connectionTimeout 1800] [unusedTimeout 1800] [agedTimeout 0] [reapTime 180] [surgeThreshold 50] [numberOfConnectionsToTest 5] [testConnection true] [stuckThreshold 0] [stuckTimerTime 0] [stuckTime 0]]’)
AdminConfig.save()
3. 验证配置
# 测试连接
AdminControl.testConnection(AdminConfig.getid(‘/DataSource:fgedudb/’))
执行结果:
连接测试成功
# 查看连接池配置
print AdminConfig.showall(AdminConfig.list(‘ConnectionPool’, AdminConfig.getid(‘/DataSource:fgedudb/’)))
[minConnections 30]
[maxConnections 100]
[connectionTimeout 1800]
[unusedTimeout 1800]
[testConnection true]
3.2 连接池优化实战
连接池优化操作:
3.2.1 参数优化
1. 分析当前配置
# 获取当前连接池状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123
# 获取连接池统计
ds = AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’)
stats = AdminControl.getAttribute(ds, ‘stats’)
print stats
{
“activeConnections”: 85,
“freeConnections”: 15,
“totalConnections”: 100,
“waitingThreads”: 5,
“averageGetTime”: 25
}
# 分析:
# – 活动连接85,使用率85%
# – 等待线程5,存在等待
# – 需要优化
2. 调整参数
# 增加最大连接数
ds = AdminConfig.getid(‘/DataSource:fgedudb/’)
cp = AdminConfig.list(‘ConnectionPool’, ds)
# 修改配置
AdminConfig.modify(cp, ‘[[minConnections 50] [maxConnections 150]]’)
AdminConfig.save()
3. 优化连接验证
# 配置连接验证
AdminConfig.modify(cp, ‘[[testConnection true] [numberOfConnectionsToTest 5]]’)
# 配置验证SQL
props = AdminConfig.list(‘Property’, ds)
AdminConfig.modify(props, ‘[[validationQuery “SELECT 1 FROM DUAL”]]’)
AdminConfig.save()
4. 优化超时参数
# 调整超时参数
AdminConfig.modify(cp, ‘[[connectionTimeout 1800] [unusedTimeout 1800] [agedTimeout 7200]]’)
AdminConfig.save()
5. 重启应用使配置生效
# 重启应用
AdminControl.invoke(
AdminControl.queryNames(‘type=ApplicationManager,process=server1,*’),
‘restartApplication’, ‘fgedu-app’
)
# 优化后验证
# 再次获取连接池状态
stats = AdminControl.getAttribute(ds, ‘stats’)
print stats
{
“activeConnections”: 90,
“freeConnections”: 60,
“totalConnections”: 150,
“waitingThreads”: 0,
“averageGetTime”: 5
}
# 优化效果:
# – 等待线程:5 → 0
# – 平均获取时间:25ms → 5ms
# – 性能提升:80%
3.3 连接池监控实战
连接池监控操作:
3.3.1 监控配置
1. 启用PMI监控
# 通过控制台启用
管理控制台 > 监控和调整 > 性能监控基础结构(PMI)
启用PMI:是
监控级别:标准
2. 监控脚本
#!/bin/bash
# pool_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
LOG_FILE=/WebSphere/logs/pool_monitor.log
while true; do
# 获取连接池状态
STATUS=$(/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “ds=AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’); print AdminControl.getAttribute(ds, ‘stats’)” \
2>/dev/null)
# 解析指标
ACTIVE=$(echo $STATUS | grep -o ‘”activeConnections”: [0-9]*’ | grep -o ‘[0-9]*’)
FREE=$(echo $STATUS | grep -o ‘”freeConnections”: [0-9]*’ | grep -o ‘[0-9]*’)
TOTAL=$(echo $STATUS | grep -o ‘”totalConnections”: [0-9]*’ | grep -o ‘[0-9]*’)
WAITING=$(echo $STATUS | grep -o ‘”waitingThreads”: [0-9]*’ | grep -o ‘[0-9]*’)
# 计算使用率
USAGE=$((ACTIVE * 100 / TOTAL))
# 记录日志
echo “$(date): 活动连接=$ACTIVE, 空闲连接=$FREE, 等待线程=$WAITING, 使用率=$USAGE%” >> $LOG_FILE
# 检查告警
if [ $USAGE -gt 80 ]; then
echo “告警:连接使用率 $USAGE%”
fi
if [ $WAITING -gt 5 ]; then
echo “告警:等待线程数 $WAITING”
fi
sleep 60
done
3. 监控报表
# 生成监控报表
#!/bin/bash
# pool_report.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
LOG_FILE=/WebSphere/logs/pool_monitor.log
echo “=== 连接池监控报表 ===”
echo “时间范围:最近24小时”
echo “”
# 统计最大使用率
MAX_USAGE=$(grep “使用率” $LOG_FILE | tail -1440 | awk -F’使用率=’ ‘{print $2}’ | awk -F’%’ ‘{print $1}’ | sort -n | tail -1)
# 统计平均使用率
AVG_USAGE=$(grep “使用率” $LOG_FILE | tail -1440 | awk -F’使用率=’ ‘{print $2}’ | awk -F’%’ ‘{sum+=$1} END {print sum/NR}’)
# 统计最大等待线程
MAX_WAITING=$(grep “等待线程” $LOG_FILE | tail -1440 | awk -F’等待线程=’ ‘{print $2}’ | awk -F’,’ ‘{print $1}’ | sort -n | tail -1)
echo “最大使用率:$MAX_USAGE%”
echo “平均使用率:$AVG_USAGE%”
echo “最大等待线程:$MAX_WAITING”
3.4 连接池故障处理实战
连接池故障处理:
3.4.1 故障诊断
1. 连接池耗尽
症状:
– 应用无法获取连接
– 错误信息:Connection not available
诊断:
# 检查连接池状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “ds=AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’); print AdminControl.getAttribute(ds, ‘stats’)”
{
“activeConnections”: 100,
“freeConnections”: 0,
“totalConnections”: 100,
“waitingThreads”: 20
}
# 分析:所有连接都在使用,存在等待
解决:
# 临时解决:增加最大连接数
AdminConfig.modify(cp, ‘[[maxConnections 150]]’)
AdminConfig.save()
# 根本解决:检查连接泄漏
# 查看应用日志,找出未关闭连接的代码
2. 连接泄漏
症状:
– 连接数持续增长
– 最终连接池耗尽
诊断:
# 启用连接泄漏检测
AdminConfig.modify(cp, ‘[[stuckThreshold 300] [stuckTimerTime 60] [stuckTime 300]]’)
AdminConfig.save()
# 查看泄漏日志
grep “Connection leak” /WebSphere/app/profiles/AppSrv01/logs/server1/SystemOut.log
解决:
# 修改应用代码,确保连接关闭
try {
Connection conn = dataSource.getConnection();
// 使用连接
} finally {
if (conn != null) {
conn.close();
}
}
3. 连接超时
症状:
– 获取连接超时
– 错误信息:Connection wait timeout
诊断:
# 检查数据库状态
sqlplus fgedu/fgedu123@fgedudb
SQL> select count(*) from v$session;
COUNT(*)
———-
150
# 检查数据库最大连接
SQL> show parameter processes;
NAME TYPE VALUE
———————————— ———– ——————————
processes integer 200
# 分析:数据库连接接近上限
解决:
# 增加数据库最大连接
SQL> alter system set processes=300 scope=spfile;
SQL> shutdown immediate;
SQL> startup;
# 或减少应用连接池大小
Part04-生产案例与实战讲解
4.1 连接池耗尽案例
连接池耗尽案例:
4.1.1 案例背景
故障现象:
应用无法访问数据库,报错连接不可用
诊断过程:
1. 检查错误日志
cat /WebSphere/app/profiles/AppSrv01/logs/server1/SystemErr.log
[4/10/26 10:00:00:000 CST] 00000001 ConnectionPool E
J2CA0081E: 尝试获取连接时发生超时
数据源:fgedudb
等待时间:180000毫秒
2. 检查连接池状态
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “ds=AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’); print AdminControl.getAttribute(ds, ‘stats’)”
{
“activeConnections”: 100,
“freeConnections”: 0,
“totalConnections”: 100,
“waitingThreads”: 50
}
3. 分析原因
– 连接池大小:100
– 活动连接:100
– 等待线程:50
– 结论:连接池耗尽
4. 检查数据库
sqlplus fgedu/fgedu123@fgedudb
SQL> select count(*) from v$session where username=’FGEDU’;
COUNT(*)
———-
100
# 数据库连接正常,问题在应用端
5. 检查应用代码
# 发现问题:部分代码未关闭连接
解决步骤:
1. 临时扩容
AdminConfig.modify(cp, ‘[[maxConnections 150]]’)
AdminConfig.save()
2. 重启应用
AdminControl.invoke(
AdminControl.queryNames(‘type=ApplicationManager,process=server1,*’),
‘restartApplication’, ‘fgedu-app’
)
3. 修复代码
# 添加连接关闭逻辑
4. 验证
# 连接池状态恢复正常
{
“activeConnections”: 50,
“freeConnections”: 100,
“totalConnections”: 150,
“waitingThreads”: 0
}
故障总结:
– 原因:连接泄漏导致连接池耗尽
– 影响:应用无法访问数据库
– 解决:修复代码,增加连接池大小
– 恢复时间:30分钟
4.2 连接泄漏案例
连接泄漏案例:
4.2.1 案例背景
故障现象:
连接数持续增长,最终耗尽
诊断过程:
1. 监控连接数
# 每小时记录连接数
10:00 – 活动连接:20
11:00 – 活动连接:35
12:00 – 活动连接:50
13:00 – 活动连接:65
14:00 – 活动连接:80
15:00 – 活动连接:95
16:00 – 活动连接:100(耗尽)
2. 启用泄漏检测
AdminConfig.modify(cp, ‘[[stuckThreshold 300] [stuckTimerTime 60] [stuckTime 300]]’)
AdminConfig.save()
3. 查看泄漏日志
grep “Connection leak” /WebSphere/app/profiles/AppSrv01/logs/server1/SystemOut.log
[4/10/26 10:30:00] Connection leak detected:
Connection created at: 2026-04-10 10:25:00
Stack trace:
at com.fgedu.dao.UserDao.getUser(UserDao.java:50)
at com.fgedu.service.UserService.getUser(UserService.java:30)
4. 定位问题代码
// UserDao.java 第50行
public User getUser(String id) {
Connection conn = dataSource.getConnection();
// 执行查询
// 问题:没有关闭连接
return user;
}
解决步骤:
1. 修复代码
public User getUser(String id) {
Connection conn = null;
try {
conn = dataSource.getConnection();
// 执行查询
return user;
} finally {
if (conn != null) {
conn.close();
}
}
}
2. 使用连接池监控
# 持续监控连接使用情况
3. 验证修复
# 连接数不再持续增长
10:00 – 活动连接:20
11:00 – 活动连接:22
12:00 – 活动连接:20
13:00 – 活动连接:25
14:00 – 活动连接:20
故障总结:
– 原因:代码未关闭连接
– 影响:连接泄漏
– 解决:修复代码,添加finally块关闭连接
– 预防:代码审查,使用try-with-resources
4.3 性能优化案例
性能优化案例:
4.3.1 案例背景
优化背景:
– 应用响应慢
– 数据库操作耗时
– 需要优化连接池
优化前状态:
指标 优化前
──────────────────────────────────────────────────────
获取连接时间 50ms
平均响应时间 500ms
连接使用率 90%
等待线程数 10
优化过程:
1. 分析瓶颈
# 获取连接时间过长
# 连接使用率过高
# 存在等待线程
2. 调整参数
# 增加连接池大小
AdminConfig.modify(cp, ‘[[minConnections 50] [maxConnections 150]]’)
# 启用连接验证
AdminConfig.modify(cp, ‘[[testConnection true]]’)
# 启用语句缓存
AdminConfig.modify(cp, ‘[[statementCacheSize 100]]’)
AdminConfig.save()
3. 优化数据库
# 优化SQL
# 添加索引
# 调整数据库参数
4. 优化应用
# 使用连接池最佳实践
# 批量操作
# 异步处理
优化后状态:
指标 优化前 优化后 提升
──────────────────────────────────────────────────────
获取连接时间 50ms 5ms 90%
平均响应时间 500ms 150ms 70%
连接使用率 90% 60% 33%
等待线程数 10 0 100%
优化总结:
– 连接池优化:增加连接数,启用验证和缓存
– 数据库优化:SQL优化,索引优化
– 应用优化:代码优化,批量处理
– 整体性能提升:70%
Part05-风哥经验总结与分享
5.1 连接池检查清单
连接池检查清单:
配置检查:
□ 连接池大小合理
□ 超时参数配置正确
□ 连接验证已启用
□ 语句缓存已配置
监控检查:
□ 连接使用率监控已启用
□ 等待线程监控已启用
□ 告警规则已配置
□ 日志记录已启用
应用检查:
□ 连接正确关闭
□ 使用连接池最佳实践
□ 无连接泄漏
□ 异常处理完善
# 连接池检查脚本
#!/bin/bash
# pool_check.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn
echo “=== 连接池检查 ===”
# 1. 检查连接池配置
echo “1. 连接池配置:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “cp=AdminConfig.list(‘ConnectionPool’, AdminConfig.getid(‘/DataSource:fgedudb/’)); print AdminConfig.showall(cp)” \
2>/dev/null
# 2. 检查连接池状态
echo “”
echo “2. 连接池状态:”
/WebSphere/app/profiles/Dmgr01/bin/wsadmin.sh -lang jython \
-username fgeduadmin -password fgedu123 \
-c “ds=AdminControl.queryNames(‘type=DataSource,name=fgedudb,*’); print AdminControl.getAttribute(ds, ‘stats’)” \
2>/dev/null
# 3. 检查告警
echo “”
echo “3. 检查告警:”
grep “Connection” /WebSphere/app/profiles/AppSrv01/logs/server1/SystemErr.log | tail -5
echo “”
echo “=== 检查完成 ===”
5.2 连接池常见问题
连接池常见问题及解决方案:
5.2.1 常见问题汇总
问题1:连接池耗尽
原因:连接泄漏或并发过高
解决:修复泄漏,增加连接数
问题2:连接超时
原因:数据库响应慢或网络问题
解决:优化数据库,检查网络
问题3:连接验证失败
原因:验证SQL错误或数据库问题
解决:检查验证SQL,检查数据库
问题4:性能下降
原因:连接池配置不当
解决:优化连接池参数
问题5:连接泄漏
原因:代码未关闭连接
解决:修复代码,添加finally块
5.3 连接池最佳实践
基于多年WebSphere运维经验,总结连接池最佳实践:
5.3.1 配置原则
- 合理配置:根据业务特点配置连接池大小
- 启用验证:启用连接验证确保连接可用
- 设置超时:合理设置各种超时参数
- 启用监控:启用连接池监控和告警
5.3.2 开发建议
- 及时关闭:确保连接正确关闭
- 使用try-finally:使用finally块关闭连接
- 避免泄漏:代码审查防止泄漏
- 性能优化:使用批量操作和缓存
本文档详细介绍了WebSphere 9.0.5的数据源连接池优化,包括连接池参数配置、性能优化、监控告警等内容。通过学习本文档,读者可以掌握WebSphere连接池优化的方法和最佳实践。更多视频教程www.fgedu.net.cn
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
