使用ODBC访问Azure上的SQL服务器



我正在为用C/C++编写的Windows维护一个遗留的桌面环境。它使用ODBC访问SQL Server(以及PostgreSQL等(。其中一名用户目前正在将其生产数据库迁移到Azure。在切换驱动程序后,一切似乎都很正常。使用连接到Azure数据库

DRIVER=ODBC driver 17 for SQL server;SERVER=tcp:<database>.database.windows.net,1433;DATABASE=<My database>;ENCRYPT=yes;TRUSTSERVERCERTIFICATE=no;Connection Timeout=60;ConnectionRetryCount=5

程序空闲一段时间(大约20分钟(后,就会出现问题。访问连接时,ODBC会抛出一个错误,表示服务器上的连接已终止。我们在使用PostgreSQL的AWS上也看到了这一点,并使用";KeepAlive";PostgreSQL ODBC驱动程序中的参数。我发现了来自微软的关于";KeepAlive";对于他们的";"用于SQL Server的ODBC驱动程序17";,但我不能让它发挥作用。无论我尝试以何种方式将";KeepAlive=50;KeepAliveInterval=10〃;对于连接字符串来说,这没有什么区别。对我来说,它们似乎只适用于linux/mac??

与数据库的连接是标准的:

dbStatus=SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &EnvHandle);
dbStatus=SQLSetEnvAttr(EnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3_80 , 0);
dbStatus=SQLAllocHandle(SQL_HANDLE_DBC, EnvHandle, &hdbc);
//connection setting..
result = SQLDriverConnect(hdbc,NULL,(UCHAR *)conStr,inLen,(UCHAR *)rConStr,MAX_DC_LEN, &rConLen, SQL_DRIVER_COMPLETE_REQUIRED);

使用SQLDriverConnect((成功连接后,我将通过以下方式检查ConnectionRetryCount和ConnectionRetryInterval:

SQLGetConnectAttr(hdbc, SQL_COPT_SS_CONNECT_RETRY_COUNT, &i, SQL_IS_INTEGER, NULL);
SQLGetConnectAttr(hdbc, SQL_COPT_SS_CONNECT_RETRY_INTERVAL, &i, SQL_IS_INTEGER, NULL);

它们(i(总是具有相同的值1和10。

我们正在使用准备好的语句和游标。在运行一个测试时,我要求将光标指向表中的所有行("从表1中选择col1,col2"(,并每分钟要求下一行,在关闭客户端之前,我已经将数据库连接保持打开24小时。

在使用Azure时,是否有任何提示和/或技巧可以使空闲的SQL Server ODBC会话保持活动状态?我百分之百肯定有,因为在AWS上使用PostgreSQL是完美的。我目前正在尝试添加C/C++代码来处理这个问题,但到目前为止还没有成功。如有任何提示,我们将不胜感激。

用于SQL Server的ODBC驱动程序中没有KeepAlive选项。

您需要使用Connection Retry IntervalConnection Retry Count功能来保持连接处于活动状态。

在您共享的连接字符串中,您正在传递ConnectionRetryCount参数,这是错误的您需要传递ConnectRetryCount参数,并传递0到255之间的值。零(0(表示不尝试重新连接。默认值为一次重新连接尝试。

要通过连接重试间隔,请使用ConnectRetryInterval参数。CCD_ 4在每次CCD_。它的范围从1(默认(到60秒,在第一次重新连接尝试后应用:

  • 当检测到断开的连接时,客户端会立即尝试重新连接(这是第一次尝试重新连接,只有在ConnectRetryCount>0时才会发生(
  • 如果第一次重新连接尝试失败,并且ConnectRetryCount>1,则客户端等待ConnectRetryInterval,以便尝试第二次和随后的重新连接尝试
  • 重新连接过程所需的时间不能超过命令超时值。因此,命令超时必须大于或等于总的重新连接时间(ConnectRetryCount*ConnectRetryInterval(

请检查https://learn.microsoft.com/en-us/sql/connect/odbc/connection-resiliency?view=sql-server-ver15了解更多详细信息。

最新更新