Если вы используете ASP.Net, вариант А - ваш друг.
Создайте новое соединение для каждого запроса, Dispose () - после завершения запроса.Убедитесь, что вы используете идентичные строки подключения.Соединения будут (по умолчанию) оставаться открытыми и доступными через пул соединений.
См. http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx для получения дополнительной информации о пуле соединений.
В значительной степени вам придется сделать этопуть на веб-сервере, так что у вас нет проблем с параллелизмом в любом случае.Все должно быть поточно-ориентированным (вы не представляете, сколько параллельных рабочих потоков выполняется в вашем приложении).
[отредактировано для добавления примера кода]
В качестве примера, вотчто я считаю типичным методом для выполнения хранимой процедуры.Это исходит из написанного мной специального генератора кода - рукописный код, скорее всего, будет выглядеть немного иначе - но этого должно быть достаточно, чтобы разобраться в этом:
public int Exec( int? @iPatientID )
{
using ( SqlConnection conn = new SqlConnection( this.ConnectString ) )
using ( SqlCommand cmd = conn.CreateCommand() )
using ( SqlDataAdapter sda = new SqlDataAdapter( cmd ) )
{
cmd.CommandText = STORED_PROCEDURE_NAME ;
cmd.CommandType = CommandType.StoredProcedure ;
if ( this.TimeoutInSeconds.HasValue )
{
cmd.CommandTimeout = this.TimeoutInSeconds.Value ;
}
//
// 1. @iPatientID
//
SqlParameter p1 = new SqlParameter( @"@iPatientID" , SqlDbType.Int ) ;
if ( @iPatientID == null )
{
p1.Value = System.DBNull.Value ;
}
else
{
p1.Value = @iPatientID ;
}
cmd.Parameters.Add( p1 ) ;
// add return code parameter
SqlParameter pReturnCode = new SqlParameter() ;
pReturnCode.SqlDbType = System.Data.SqlDbType.Int ;
pReturnCode.Direction = System.Data.ParameterDirection.ReturnValue ;
cmd.Parameters.Add( pReturnCode ) ;
DataSet ds = new DataSet() ;
conn.Open() ;
sda.Fill( ds ) ;
conn.Close() ;
this.ResultSet = ( ds.Tables.Count > 0 ? ds.Tables[0] : null ) ;
this.ReturnCode = (int) pReturnCode.Value ;
}
return this.ReturnCode ;
}