[to #51856685]fix dblink sanity core by optimizing dblink connection management

This commit is contained in:
seuwebber
2023-09-08 12:20:53 +08:00
committed by ob-robot
parent 8194d7657a
commit 67319c4c5d
3 changed files with 55 additions and 29 deletions

View File

@ -56,8 +56,7 @@ int ObPLDbLinkGuard::get_routine_infos_with_synonym(sql::ObSQLSessionInfo &sessi
int64_t object_type;
OZ (schema_guard.get_dblink_schema(tenant_id, dblink_name, dblink_schema), tenant_id, dblink_name);
OV (OB_NOT_NULL(dblink_schema), OB_DBLINK_NOT_EXIST_TO_ACCESS, dblink_name);
OX (link_type = static_cast<DblinkDriverProto>(dblink_schema->get_driver_proto()));
OZ (ObPLDblinkUtil::init_dblink(dblink_proxy, dblink_conn, session_info, schema_guard, dblink_name));
OZ (ObPLDblinkUtil::init_dblink(dblink_proxy, dblink_conn, session_info, schema_guard, dblink_name, link_type));
CK (OB_NOT_NULL(dblink_proxy));
CK (OB_NOT_NULL(dblink_conn));
OZ (ObPLDblinkUtil::print_full_name(alloc_, full_name, part1, part2, part3));
@ -70,13 +69,24 @@ int ObPLDbLinkGuard::get_routine_infos_with_synonym(sql::ObSQLSessionInfo &sessi
sub_object_name,
object_type,
alloc_));
OZ (get_dblink_routine_infos(session_info,
OZ (get_dblink_routine_infos(dblink_proxy,
dblink_conn,
session_info,
schema_guard,
dblink_name,
schema_name,
object_name,
sub_object_name,
routine_infos));
if (OB_NOT_NULL(dblink_proxy) && OB_NOT_NULL(dblink_conn)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = dblink_proxy->release_dblink(link_type, dblink_conn))) {
LOG_WARN("failed to relese connection", K(tmp_ret));
}
if (OB_SUCC(ret)) {
ret = tmp_ret;
}
}
#endif
return ret;
}
@ -96,7 +106,8 @@ int ObPLDbLinkGuard::get_dblink_type_with_synonym(sql::ObSQLSessionInfo &session
#else
common::ObDbLinkProxy *dblink_proxy = NULL;
common::sqlclient::ObISQLConnection *dblink_conn = NULL;
OZ (ObPLDblinkUtil::init_dblink(dblink_proxy, dblink_conn, session_info, schema_guard, dblink_name));
common::sqlclient::DblinkDriverProto link_type = DBLINK_UNKNOWN;
OZ (ObPLDblinkUtil::init_dblink(dblink_proxy, dblink_conn, session_info, schema_guard, dblink_name, link_type));
CK (OB_NOT_NULL(dblink_proxy));
CK (OB_NOT_NULL(dblink_conn));
if (OB_SUCC(ret)) {
@ -119,7 +130,9 @@ int ObPLDbLinkGuard::get_dblink_type_with_synonym(sql::ObSQLSessionInfo &session
object_type,
alloc_));
OV (static_cast<int64_t>(ObObjectType::PACKAGE) == object_type);
OZ (get_dblink_type_by_name(session_info,
OZ (get_dblink_type_by_name(dblink_proxy,
dblink_conn,
session_info,
schema_guard,
dblink_name,
schema_name,
@ -127,11 +140,22 @@ int ObPLDbLinkGuard::get_dblink_type_with_synonym(sql::ObSQLSessionInfo &session
sub_object_name,
udt));
}
if (OB_NOT_NULL(dblink_proxy) && OB_NOT_NULL(dblink_conn)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = dblink_proxy->release_dblink(link_type, dblink_conn))) {
LOG_WARN("failed to relese connection", K(tmp_ret));
}
if (OB_SUCC(ret)) {
ret = tmp_ret;
}
}
#endif
return ret;
}
int ObPLDbLinkGuard::get_dblink_routine_infos(sql::ObSQLSessionInfo &session_info,
int ObPLDbLinkGuard::get_dblink_routine_infos(common::ObDbLinkProxy *dblink_proxy,
common::sqlclient::ObISQLConnection *dblink_conn,
sql::ObSQLSessionInfo &session_info,
share::schema::ObSchemaGetterGuard &schema_guard,
const ObString &dblink_name,
const ObString &db_name,
@ -166,7 +190,9 @@ int ObPLDbLinkGuard::get_dblink_routine_infos(sql::ObSQLSessionInfo &session_inf
OZ (dblink_infos_.push_back(dblink_info));
}
}
OZ ((const_cast<ObPLDbLinkInfo *>(dblink_info))->get_routine_infos(session_info,
OZ ((const_cast<ObPLDbLinkInfo *>(dblink_info))->get_routine_infos(dblink_proxy,
dblink_conn,
session_info,
schema_guard,
alloc_,
dblink_name,
@ -318,20 +344,13 @@ int ObPLDbLinkGuard::dblink_name_resolve(common::ObDbLinkProxy *dblink_proxy,
}
#undef BIND_BASIC_BY_POS
}
if ((NULL != dblink_conn)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = static_cast<ObOciConnection *>(dblink_conn)->free_oci_stmt())) {
LOG_WARN("failed to close oci result", K(tmp_ret));
if (OB_SUCC(ret)) {
ret = tmp_ret;
}
}
}
#endif
return ret;
}
int ObPLDbLinkGuard::get_dblink_type_by_name(sql::ObSQLSessionInfo &session_info,
int ObPLDbLinkGuard::get_dblink_type_by_name(common::ObDbLinkProxy *dblink_proxy,
common::sqlclient::ObISQLConnection *dblink_conn,
sql::ObSQLSessionInfo &session_info,
share::schema::ObSchemaGetterGuard &schema_guard,
const common::ObString &dblink_name,
const common::ObString &db_name,
@ -365,7 +384,7 @@ int ObPLDbLinkGuard::get_dblink_type_by_name(sql::ObSQLSessionInfo &session_info
OZ (dblink_infos_.push_back(dblink_info));
}
}
OZ ((const_cast<ObPLDbLinkInfo *>(dblink_info))->get_udt_by_name(session_info,
OZ ((const_cast<ObPLDbLinkInfo *>(dblink_info))->get_udt_by_name(dblink_proxy, dblink_conn, session_info,
schema_guard, alloc_, dblink_name, db_name, pkg_name,
udt_name, udt, next_link_object_id_));
#endif

View File

@ -110,7 +110,9 @@ private:
int64_t &object_type,
ObIAllocator &alloctor);
int get_dblink_routine_infos(sql::ObSQLSessionInfo &session_info,
int get_dblink_routine_infos(common::ObDbLinkProxy *dblink_proxy,
common::sqlclient::ObISQLConnection *dblink_conn,
sql::ObSQLSessionInfo &session_info,
share::schema::ObSchemaGetterGuard &schema_guard,
const common::ObString &dblink_name,
const common::ObString &db_name,
@ -118,7 +120,9 @@ private:
const common::ObString &routine_name,
common::ObIArray<const share::schema::ObIRoutineInfo *> &routine_infos);
int get_dblink_type_by_name(sql::ObSQLSessionInfo &session_info,
int get_dblink_type_by_name(common::ObDbLinkProxy *dblink_proxy,
common::sqlclient::ObISQLConnection *dblink_conn,
sql::ObSQLSessionInfo &session_info,
share::schema::ObSchemaGetterGuard &schema_guard,
const common::ObString &dblink_name,
const common::ObString &db_name,

View File

@ -8544,11 +8544,14 @@ int ObSPIService::spi_execute_dblink(ObExecContext &exec_ctx,
OZ (spi_after_execute_dblink(session, routine_info, allocator, params, exec_params));
}
if (OB_NOT_NULL(dblink_conn)) {
if (OB_NOT_NULL(dblink_proxy) && OB_NOT_NULL(dblink_conn)) {
int tmp_ret = OB_SUCCESS;
if (OB_SUCCESS != (tmp_ret = dblink_proxy->release_dblink(link_type, dblink_conn))) {
LOG_WARN("failed to relese connection", K(tmp_ret));
}
if (OB_SUCC(ret)) {
ret = tmp_ret;
}
}
return ret;
}