C# AWS Lambda函数在第一次运行时起作用,但在第二次运行时不起作用
我有一个C#Lambda函数,它在第一次执行时工作,但在第二次执行时失败。 我创建了一些日志来帮助我解决问题所在,但我很难弄清楚到底发生了什么 第一个执行日志:C# AWS Lambda函数在第一次运行时起作用,但在第二次运行时不起作用,c#,mysql,amazon-web-services,aws-lambda,C#,Mysql,Amazon Web Services,Aws Lambda,我有一个C#Lambda函数,它在第一次执行时工作,但在第二次执行时失败。 我创建了一些日志来帮助我解决问题所在,但我很难弄清楚到底发生了什么 第一个执行日志: START RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Version: $LATEST 1. Connecion to Database is Open 2. Running Query: SELECT * FROM Employee3 3. Returning Results 4. C
START RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Version: $LATEST
1. Connecion to Database is Open
2. Running Query: SELECT * FROM Employee3
3. Returning Results
4. Close connection
5. Close reader
6. Dispose cmd
7. Configure encoding and string to stream
END RequestId: XXXXXXXXXXXXXXXXXXXXXXXX
REPORT RequestId: XXXXXXXXXXXXXXXXXXXXXXXX Duration: 10097.73 ms Billed Duration: 10100 ms Memory Size: 128 MB Max Memory Used: 41 MB
START RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Version: $LATEST
1. Connecion to Database is Open
2. Running Query: SELECT * FROM Employee3
Connection must be valid and open.: InvalidOperationException
at MySql.Data.MySqlClient.MySqlCommand.Throw(Exception ex)
at MySql.Data.MySqlClient.MySqlCommand.CheckState()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at LambdaDBTest.Function.returnRows(MySqlConnection connection)
at LambdaDBTest.Function.FunctionHandler(Stream input, ILambdaContext context)
at lambda_method(Closure , Stream , Stream , ContextInfo )
END RequestId: XXXXXXXXXXXXXXXXXXXXXXXX
REPORT RequestId: XXXXXXXXXXXXXXXXXXXXXXXX Duration: 1203.12 ms Billed Duration: 1300 ms Memory Size: 128 MB Max Memory Used: 47 MB
回答:(我知道这不是有效的JSON,这是我最终的目标,但一旦我弄明白了这一点,这将是我下一步要解决的问题)
第二个执行日志:
START RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Version: $LATEST
1. Connecion to Database is Open
2. Running Query: SELECT * FROM Employee3
3. Returning Results
4. Close connection
5. Close reader
6. Dispose cmd
7. Configure encoding and string to stream
END RequestId: XXXXXXXXXXXXXXXXXXXXXXXX
REPORT RequestId: XXXXXXXXXXXXXXXXXXXXXXXX Duration: 10097.73 ms Billed Duration: 10100 ms Memory Size: 128 MB Max Memory Used: 41 MB
START RequestId: XXXXXXXXXXXXXXXXXXXXXXXXXXXXX Version: $LATEST
1. Connecion to Database is Open
2. Running Query: SELECT * FROM Employee3
Connection must be valid and open.: InvalidOperationException
at MySql.Data.MySqlClient.MySqlCommand.Throw(Exception ex)
at MySql.Data.MySqlClient.MySqlCommand.CheckState()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at LambdaDBTest.Function.returnRows(MySqlConnection connection)
at LambdaDBTest.Function.FunctionHandler(Stream input, ILambdaContext context)
at lambda_method(Closure , Stream , Stream , ContextInfo )
END RequestId: XXXXXXXXXXXXXXXXXXXXXXXX
REPORT RequestId: XXXXXXXXXXXXXXXXXXXXXXXX Duration: 1203.12 ms Billed Duration: 1300 ms Memory Size: 128 MB Max Memory Used: 47 MB
以下是我正在使用的代码:
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using MySql.Data.MySqlClient;
using Amazon.Lambda.Core;
using Amazon.Lambda.Serialization;
using System.Text;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializerAttribute(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
namespace LambdaDBTest
{
public class Function
{
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
public Stream FunctionHandler(Stream input, ILambdaContext context)
{
var dbCon = DBConnection.Instance();
dbCon.Server = "AWS-URI";
dbCon.DatabaseName = "DBNAME";
dbCon.User = "DBUSER";
dbCon.Password = "DBPASS";
string textInput;
if (dbCon.IsConnect())
{
textInput = "Connecion to Database is Open";
LambdaLogger.Log("\n 1. " + textInput);
textInput += returnRows(dbCon.Connection);
}
else
{
textInput = "\n Connecion to Database is NOT Open";
}
dbCon.Close();
LambdaLogger.Log("\n 7. Configure encoding and string to stream\n");
input = new System.IO.MemoryStream(System.Text.Encoding.UTF8.GetBytes(textInput));
return input;
}
public static MemoryStream GenerateStreamFromString(string value)
{
return new MemoryStream(Encoding.UTF8.GetBytes(value ?? ""));
}
static string returnRows(MySqlConnection connection)
{
string output = null;
string query = @"SELECT * FROM Employee3";
LambdaLogger.Log("\n 2. Running Query: " + query);
var cmd = new MySqlCommand(query, connection);
var reader = cmd.ExecuteReader();
LambdaLogger.Log("\n 3. Returning Results");
while (reader.Read())
{
output += "\n" + (string)reader["Name"];
}
LambdaLogger.Log("\n 4. Close connection");
connection.Close();
LambdaLogger.Log("\n 5. Close reader");
reader.Close();
LambdaLogger.Log("\n 6. Dispose cmd");
cmd.Dispose();
return output + "\r";
}
}
}
进程reader
被Lambda冻结,因此虽然由于.net MySQL驱动程序的连接池,我不需要关闭MySQL连接,但实际上我需要调用reader.close()
以终止冻结的进程。谢谢你,乌多·霍尔德:)我有点怀疑。
代码看起来好像每次都在打开和关闭连接,这很好。但是,您的驱动程序可能不会实际关闭连接,而只是将其返回到池中。
AWS在请求之间创建实例。因此,如果池保持与数据库的连接打开,它实际上可能会由于AWS冻结代码而断开连接
查看it声明“连接器/Net支持连接池,以便在数据库密集型应用程序中获得更好的性能和可扩展性。这在默认情况下是启用的。
”
您没有提供连接字符串,但您可能应该尝试禁用连接池,添加类似pooling=false的内容。还有一些你可能也想试试。我有点怀疑。
代码看起来好像每次都在打开和关闭连接,这很好。但是,您的驱动程序可能不会实际关闭连接,而只是将其返回到池中。
AWS在请求之间创建实例。因此,如果池保持与数据库的连接打开,它实际上可能会由于AWS冻结代码而断开连接
查看it声明“连接器/Net支持连接池,以便在数据库密集型应用程序中获得更好的性能和可扩展性。这在默认情况下是启用的。
”
您没有提供连接字符串,但您可能应该尝试禁用连接池,添加类似pooling=false的内容。您可能也想尝试一下。在这里,您很可能走上了正确的道路。数据库托管在RDS实例中,因此我认为我无法访问该实例。我刚刚更新了代码以删除所有连接关闭语句,然后收到以下错误“errorMessage”:“已经有一个与此连接关联的打开的DataReader,必须先关闭。
…这绝对是一个线索:)您在这里很可能走对了方向。数据库托管在RDS实例中,因此我认为我无法访问该实例。我刚刚更新了代码以删除所有连接关闭语句,然后收到以下错误“errorMessage”:“已经有一个与此连接关联的打开的DataReader,必须先关闭。
…这绝对是一个线索:)现在可能要更改您的用户名和密码现在可能要更改您的用户名和密码