Skip to content

API接口调用超时问题 #1288

Description

@yijianguanzhu

版本:1.10.0 社区版,通过docker运行

问题描述:
SQLBot小助手高级应用设置中,我在获取高级应用 API 接口 的服务里,回调SQLBot的OpenAPI接口(/api/v1/datasource/get/{id} /api/v1/datasource/tableList/{id} /api/v1/datasource/fieldList/{id})获取数据源信息并拼接返回结果,会报读超时错误。

以下为请求路径图:

Image

以下为界面效果图:

Image

以下为java服务接口代码块

@RestController
@RequestMapping("/ai/faq")
@Slf4j
public class AIFAQController {

	@Autowired
	private SQLBotService sqlBotService;

	/**
	 * @see "https://sqlbot.org/docs/v1/embedding_integration/#24-api"
	 */
	@GetMapping(value = "/sqlbot/datasource")
	public ResponseEntity<RespEntity<JSONArray>> sqlbotDatasource( @RequestParam Map<String, Object> params ) {
		return R.data( getExample() );
	}

	public JSONArray getExample() {
		JSONObject requestBody = new JSONObject();
		requestBody.put( "fieldName", "" );
		JSONObject sqlbotDs = sqlBotService.post( "/api/v1/datasource/get/1", JSONObject.class );
		JSONArray dataArray = new JSONArray();
		// 数据源对象
		JSONObject dataSource = new JSONObject();
		// 数据库IP | 类型:string
		dataSource.put( "name", sqlbotDs.getString( "name" ) );
		// 数据库种类 | 类型:string
		dataSource.put( "type", sqlbotDs.getString( "type" ) );
		// 数据库IP | 类型:string
		dataSource.put( "host", "127.0.0.1" );
		// 数据库开放的端口 | 类型:integer(int32)
		dataSource.put( "port", 3306 );
		// 数据库用户名 | 类型:string
		dataSource.put( "user", "root" );
		// 数据库密码 | 类型:string
		dataSource.put( "password", "root" );
		// 数据库内的库名 | 类型:string
		dataSource.put( "dataBase", "saa_data_agent_product" );
		// 数据库模式,部分数据库会有 | 类型:string
		dataSource.put( "schema", "schema" );
		// 针对数据源的描述,可在数据源处查看编辑,详细的描述可以帮助 SQLBot 生成答案 | 类型:string
		dataSource.put( "comment", sqlbotDs.getString( "description" ) );
		JSONArray sqlbotTables = sqlBotService.post( "/api/v1/datasource/tableList/1", JSONArray.class );
		// tables数组
		JSONArray tablesArray = new JSONArray();
		for ( int i = 0; i < sqlbotTables.size(); i++ ) {
			JSONObject sqlbotTable = sqlbotTables.getJSONObject( i );
			if ( sqlbotTable.getBoolean( "checked" ) ) {
				JSONObject table = new JSONObject();
				// 构建数据集的数据表名称 | 类型:string
				table.put( "name", sqlbotTable.getString( "table_name" ) );
				// 数据集的名字,详细的以及和问题相关的描述也能够帮助 SQLBot 生成答案 | 类型:string
				table.put( "comment", sqlbotTable.getString( "custom_comment" ) );
				// DataEase 无具体赋值 在 SQLBot 中该该字段会传值给 AiModelQuestion类,帮助 AI 以字段内容规定回答格式 | 类型:string
				table.put( "rule", "" );
				JSONArray sqlbotFields = sqlBotService.post( "/api/v1/datasource/fieldList/" + sqlbotTable.getString( "id" ),
						JSONArray.class, requestBody );
				JSONArray fields = new JSONArray();
				for ( int j = 0; j < sqlbotFields.size(); j++ ) {
					JSONObject sqlbotField = sqlbotFields.getJSONObject( j );
					if ( sqlbotField.getBoolean( "checked" ) ) {
						JSONObject field = new JSONObject();
						// 字段名 | 类型:string
						field.put( "name", sqlbotField.getString( "field_name" ) );
						// 字段的数据类型 | 类型:string
						field.put( "type", sqlbotField.getString( "field_type" ) );
						// 字段描述 | 类型:string
						field.put( "comment", sqlbotField.getString( "custom_comment" ) );
						fields.add( field );
					}
				}
				table.put( "fields", fields );
				tablesArray.add( table );
			}
		}
		dataSource.put( "tables", tablesArray );
		dataArray.add( dataSource );
		return dataArray;
	}
}

以下是我个人初步原因分析:
1、sqlbot接口/api/v1/system/assistant/ds调用我的服务接口,而我的服务接口又调用SQLBot的数据源接口,由读超时判断SQLBot的API接口是单线程同步阻塞的,因为/api/v1/system/assistant/ds接口未执行完,导致我的接口服务调用SQLBot的接口就一直卡着
2、此问题是BUG还是因为社区版本的限制?

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions