After I researched the problems and implemented the solutions in this post http://brookssoftwaredev.blogspot.com/2014/01/net-datareader-not-closing-connection.html I found that I was still getting timeouts while trying to obtain a connection from the pool.
I researched more and found that doing normal conversion like
caused boxing and unboxing of the values. I was doing this on several values for many records.
I did some research and found that the boxing and unboxing causes the garbage collector to bog down. I found that the DataReader has special methods to avoid the boxing and unboxing. These methods are things like GetChar, GetDouble, GetDateTime, and GetInt32. From what I read these stop the boxing and unboxing and prevent the garbage collector from thrashing.
Once I implemented those methods my timeouts on the connection pool went away. It appears as though the garbage collector couldn't clean up the connections, since it was busy with all of the rogue objected from the DataReader boxing and unboxing.
I realized that using a DataReader left the connection open and there needed to be precautions taken, but there are several other things that you must deal with when using a DataReader, so use caution.