For years we had the client keep a single persistent connection to the database. The problem comes in detecting an intermittent connection failure and gracefully reconnecting. Quite often you won't know that a connection failed until you try to use it (i.e. issuing a select will throw a 'General SQL Error')
We now use a globally available static class who's job is to hand you a new connection to the database, and when you're done with it you use the same class to get rid of the connection.
DbConnection conn = Database.GetConnection();
try
{
//do stuff with the connetion
...
}
finally
{
Database.DisposeConnection(conn);
}
We do this because there is initialization needed when we connect to the database (we store information is SQL Server's CONTEXT_INFO, and must empty that information when we disconnect)