using System;
using System.Data;
using System.Data.SqlClient;
namespace Craft
{
class Mate
{
// Connection pooling 101: http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx
// To check the number of connections made:
static string checkPooledConnections =
@"SELECT spid, uid=rtrim(loginame), Program_name=rtrim(Program_name),
dbname=db_name(dbid), status=rtrim(status)
FROM master.dbo.sysprocesses
WHERE program_name = '.Net SqlClient Data Provider'";
static void Main(string[] args)
{
using (var connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=test"))
{
connection.Open();
// Pool A is created.
using (var cmd = connection.CreateCommand())
{
string languageCode = "zh";
Console.WriteLine("Set Language: {0}", languageCode);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "SetLanguage";
var prm = cmd.CreateParameter();
prm.ParameterName = "@LanguageCode";
prm.Value = languageCode;
cmd.Parameters.Add(prm);
cmd.ExecuteNonQuery();
}
ShowLanguage(connection);
connection.Close();
}
using (var connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=Test"))
{
connection.Open();
// Pool B is created because the connection strings differ.
// Even the database is the same, the casing of the database name is different(uppercased T), hence connection pooler treating this connection as different connection
ShowLanguage(connection);
connection.Close();
}
using (var connection = new SqlConnection("Integrated Security=SSPI;Initial Catalog=test"))
{
connection.Open();
// The connection string matches pool A.
Console.WriteLine("Shall show no language even this connection matches the connection pool A.");
ShowLanguage(connection);
connection.Close();
}
Console.WriteLine("\nPlease execute the following query on SSMS before hitting the Enter key. You shall see that there are only two connections made instead of three. Connection pooling is in effect\n\n{0}",
checkPooledConnections);
Console.ReadKey();
}
static void ShowLanguage(SqlConnection connection)
{
using (var getLang = connection.CreateCommand())
{
getLang.CommandType = CommandType.Text;
getLang.CommandText = "select cast(CONTEXT_INFO() as varchar(5))";
object userLanguageCode = getLang.ExecuteScalar();
Console.WriteLine("Get Language: {0}\n", userLanguageCode);
Console.ReadKey();
}
}
} // classmate
} // namespacecraft
SetLanguage SP:
create procedure SetLanguage(@LanguageCode varchar(5)) as
begin
declare @binvar varbinary(128);
set @binvar = cast(@LanguageCode as varbinary(128));
set context_info @binvar;
end;
No comments:
Post a Comment