I also use Session in my application to keep user access data. I consider it faster than looking through the direct database.
Question 1
Regarding the loss of the Session, I believe you should set your session time-out to a greater value. Change your Web.config as shown below:
<system.web>
<sessionState timeout="60"></sessionState>
...
Another thing I do is in Global.asax.cs, I see if the session has already died and has Form authentication, I re-create the session. Example below:
protected void Application_PreRequestHandlerExecute(object sender, EventArgs e)
{
if (Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)
{
HttpCookie authenticationCookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (authenticationCookie != null)
{
FormsAuthenticationTicket authenticationTicket = FormsAuthentication.Decrypt(authenticationCookie.Value);
if (!authenticationTicket.Expired)
{
if (Session["usuarioLogado"] == null)
{
CriaNovamenteSession(authenticationTicket.Name);
}
}
}
else
Session["usuarioLogado"] = null;
}
}
Question 2
I have not tested with so many users, but I think it's better to have 1000 pointers than all the time to access the database to grab data.