Solution :
If you are even using the static connections you're trying to create the lock for every thread trying to access your object. ASP.NET is the multithreading environment by its nature. So there is the great chance for these locks which causes the performance issues at best. Actually very soon or later you will start geting many different exceptions(like the ExecuteReader requires an open and available Connection etc).
Conclusion:
· Don't reuse the connections or any of the ADO.NET objects at all.
· Don't make them the static or shared(in VB.NET)
· Always try to create, open(in case of the Connections), use the close and dispose them where you need them(example in the method)
· Use a using-statement to dispose and close(in case of the Connections) implicitly
That is very true not only for your Connections. Every object implementing the IDisposable should be disposed(simplest by the using-statement), all and more in a System.Data.SqlClient namespace.
All the above tries to speaks against the custom DB-Class which encapsulates and reuse the all objects.