我有一个dotnet核心容器应用程序(linux),它使用以下代码对db2(z/os)进行异步SELECT调用:
var result = new DataTable();
var query = "SELECT * FROM DB.TABLE WITH UR;"
using (var connection = new DB2Connection(_connection))
{
await connection.OpenAsync();
using (var command = new DB2Command(query, connection))
{
using (var myReader = await command.ExecuteReaderAsync()) // fails here when query > 1190 chars
{
result.Columns.AddRange(myReader.GetColumnSchema()
.Select(x => new DataColumn(x.ColumnName, x.DataType))
.ToArray());
result.BeginLoadData();
while (await myReader.ReadAsync())
{
var contents = new object[myReader.FieldCount];
myReader.GetValues(contents);
result.LoadDataRow(contents, false);
}
result.EndLoadData();
}
}
}
此代码适用于任何少于1190个字符的查询。当我将sql字符串增加到1191个字符或更多时,调用将挂起并超时,并显示以下错误:
异常(0x 80004005):错误[08001] [IBM] SQL 30081 N检测到一个通信错误。正在使用的通信协议:“TCP/IP”。正在使用的通信API:“SOCKETS”。检测到错误的位置:“170.2.8.84“。通信功能检测到错误:“recv”。协议特定错误代码:“110”、“"、“"。SQLSTATE=08001*
在本地运行Docker时不会出现此问题。我无法在有问题的主机上运行Windows容器,因此无法进行比较。
委托单位:
# db2level
DB21085I This instance or install (instance name, where applicable: "*") uses
"64" bits and DB2 code release "SQL11055" with level identifier "0606010F".
Informational tokens are "DB2 v11.5.5.1", "s2103171200", "DYN2103171200AMD64",
and Fix Pack "1".
Product is installed at "/app/clidriver".
DBA无法看到超时查询的任何活动。根据此特定大小阈值,哪些因素可能会阻碍这些调用?
1条答案
按热度按时间6qqygrtg1#
要测试db2 cli是否可以执行相同的SQL语句(即独立于C#和独立于.net core),您可以复制并修改下面的脚本,方法是从凭据json文件(或您收到连接字符串详细信息的任何地方)复制主机名、用户名、口令和端口号。
如果您的连接未使用SSL/TLS加密,请修改脚本以从数据库和下面的dsn定义中删除Security=SSL参数,并使用正确的非SSL端口号。
如果您的密码包含了任何被您的linux shell认为是特殊的字符,在脚本中指定下面的密码变量时,请用反斜杠\转义每个这样的特殊字符。否则,您将得到SQL 30082 N reason“24”。
修改此文件后,使用chmod +x组合键修改该文件,然后运行它。