Skip to content

Commit a09f9c7

Browse files
feat(nl2sql): enhance datasource connection testing with loading stat… (alibaba#2033)
feat(nl2sql): enhance datasource connection testing with loading state and timeout handling
1 parent 4fee07e commit a09f9c7

File tree

1 file changed

+35
-5
lines changed
  • spring-ai-alibaba-nl2sql/spring-ai-alibaba-nl2sql-web-ui/src/views

1 file changed

+35
-5
lines changed

spring-ai-alibaba-nl2sql/spring-ai-alibaba-nl2sql-web-ui/src/views/AgentDetail.vue

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -478,9 +478,12 @@
478478
<button
479479
class="btn btn-sm btn-outline"
480480
@click="testDatasourceConnection(agentDatasource.datasource.id)"
481-
title="测试连接"
481+
:disabled="testingConnections.has(agentDatasource.datasource.id)"
482+
:title="testingConnections.has(agentDatasource.datasource.id) ? '测试中...' : '测试连接'"
482483
>
483-
测试连接
484+
<i v-if="testingConnections.has(agentDatasource.datasource.id)" class="bi bi-arrow-clockwise spin"></i>
485+
<span v-if="!testingConnections.has(agentDatasource.datasource.id)">测试连接</span>
486+
<span v-else>测试中...</span>
484487
</button>
485488
<button
486489
class="btn btn-sm btn-danger"
@@ -1165,6 +1168,7 @@ export default {
11651168
// 数据源测试相关
11661169
const showTestResult = ref(false)
11671170
const testResultMessage = ref('')
1171+
const testingConnections = ref(new Set()) // 存储正在测试的数据源ID
11681172
11691173
// 初始化信息源相关数据
11701174
const showSchemaInitModal = ref(false)
@@ -1505,18 +1509,43 @@ export default {
15051509
}
15061510
15071511
const testDatasourceConnection = async (datasourceId) => {
1512+
// 防止重复测试同一个数据源
1513+
if (testingConnections.value.has(datasourceId)) {
1514+
showMessage('该数据源正在测试中,请稍候', 'warning')
1515+
return
1516+
}
1517+
1518+
// 添加到测试中的集合
1519+
testingConnections.value.add(datasourceId)
1520+
1521+
// 创建30秒超时的Promise
1522+
const timeoutPromise = new Promise((_, reject) => {
1523+
setTimeout(() => {
1524+
reject(new Error('连接测试超时(30秒),请检查网络连接或数据库配置'))
1525+
}, 30000)
1526+
})
1527+
15081528
try {
1509-
const result = await datasourceApi.testConnection(datasourceId)
1529+
// 使用Promise.race来实现超时控制
1530+
const result = await Promise.race([
1531+
datasourceApi.testConnection(datasourceId),
1532+
timeoutPromise
1533+
])
1534+
15101535
if (result.success) {
15111536
showMessage('连接测试成功', 'success')
15121537
} else {
15131538
showMessage('连接测试失败:' + result.message, 'error')
15141539
}
15151540
// 重新加载数据源状态
1516-
loadDatasources()
1541+
await loadDatasources()
15171542
} catch (error) {
15181543
console.error('连接测试失败:', error)
1519-
showMessage('连接测试失败,请重试', 'error')
1544+
const errorMessage = error.message || '连接测试失败,请重试'
1545+
showMessage(errorMessage, 'error')
1546+
} finally {
1547+
// 无论成功还是失败,都要从测试中的集合移除
1548+
testingConnections.value.delete(datasourceId)
15201549
}
15211550
}
15221551
@@ -2210,6 +2239,7 @@ export default {
22102239
datasourceForm,
22112240
showTestResult,
22122241
testResultMessage,
2242+
testingConnections,
22132243
// 初始化信息源相关
22142244
schemaInitForm,
22152245
availableTables,

0 commit comments

Comments
 (0)