Pergunta

Im atualmente criando um webportal com ASP.NET que depende fortemente de uso de banco de dados. Basicamente, cada (bem quase todos: P). GET consulta de qualquer usuário irá resultar em uma consulta ao banco de dados do servidor

Agora, eu sou muito novo para isso, e eu estou muito preocupado com o desempenho. Devido a minha falta de experiência nesta área, eu realmente não sei o que esperar.

A minha pergunta é, usando ADO.NET, seria uma escolha mais inteligente para apenas deixar uma conexão estática aberta a partir do servidor para o banco de dados, e depois verificar o integrety deste serverside conexão antes de cada consulta ao banco de dados? - Ou, eu seria melhor abrir a conexão antes de cada consulta e, em seguida, fechá-lo depois

?

Na minha cabeça a primeira opção seria o melhor como você economizar tempo handshaking etc. antes de cada consulta e você economizar memória tanto no banco de dados e do lado do servidor, porque você só tem uma conexão, mas há algumas quedas a esta abordagem ? Poderia 2 consultas enviar ao mesmo tempo potencialmente destruir uns aos outros integridade ou misturar o conjunto de dados retornado?

Eu tentei pesquisar em todos os lugares aqui e na web para encontrar algumas das melhores práticas sobre isso, mas sem sorte. Mais próximo que eu obtive era esta: é seguro manter as conexões de banco de dados aberto para muito tempo , mas que parece ser mais apropriado para sistemas distribuídos onde você tem mais de um usuário do banco de dados, enquanto eu só tenho meu servidor Web ..

Foi útil?

Solução

Você é muito cedo para se preocupar com o desempenho.

De qualquer forma, as conexões são reunidos pela estrutura. Você deve ser de abri-los, usá-los e eliminá-los o mais rápido possível.

Algo como ...

public object Load()
{
  using (SqlConnection cn = new SqlConnection(connectionString))
  using (SqlCommand cm = new SqlCommand(commandString, cn))
  {
    cn.Open();
    return cm.ExecuteScalar();
  }
}

Outras dicas

É melhor deixar alça ADO.NET o pool de conexão. Ele vai persistir a conexão se ele pensa que precisa, mas não use um objeto de conexão estática. Isso só cheira. Seria melhor para passar o objeto de conexão em torno de métodos que precisam dele, e criar a conexão em um bloco using.

Você deve sempre fechar a sua ligação depois de terminar a sua interação DB. ADO.NET tem o pool de conexão que vai cuidar de reutilização da conexão eficiente. Sempre que você abre 2º, 3º e conexões subseqüentes -. Eles vão ser tomadas a partir de uma piscina com quase nenhuma despesa

Espero que isso ajude.

Eu estaria pensando mais sobre o cache do que o pool de conexão avançada. Cada get requer um hit banco de dados?

Se seu um portal que você tem conteúdo comum e conteúdo específico de usuário, usando o cache pode armazenar itens comuns, bem como com uma chave mutilado (com a ID de usuários), você pode armazenar itens de usuário específicas.

ADO.NET faz pool de conexão. Quando você chamar close no objeto de conexão que irá manter a conexão na piscina fazendo a próxima conexão muito mais rápida.

Seu palpite inicial é correto. O que você precisa é conexão com o banco pooling.

Você definitivamente não quer abrir uma conexão para cada chamada de banco de dados, que irá resultar em muito mau desempenho muito rapidamente. Estabelecer um banco de dados de conexão é muito caro.

Em vez disso o que você deve estar usando um pool de conexão. A piscina vai gerir as suas ligações, e tentar conexões existentes re-uso, quando possível.

Eu não sei a sua plataforma, mas olhar para Connection Pooling - deve haver uma biblioteca ou um utilitário disponível (ou no sistema de base ou como um add-on, ou fornecido com os drivers de banco de dados) que irá fornecer os meios a piscina várias conexões ativas no banco de dados, que estão prontos e ansioso para ser usado quando você obter um na piscina.

Para ser honesto, eu esperaria a partilha de ocorrer por padrão em qualquer biblioteca de abstração de banco de dados (com uma opção disponível para desativá-lo). Parece que ADO.NET faz isso.

Realmente a primeira pergunta a fazer é por que você está muito preocupado com o desempenho? Qual é a sua carga de trabalho esperada? Você já tentou isso ainda?

Mas, em geral, sim, é mais inteligente para ter uma conexão aberta que você mantenha em torno de um tempo que para re-abrir uma conexão de banco de dados de cada vez; dependendo do tipo de conexão, problemas de rede, e fase da lua, pode levar uma boa parte de um segundo ou mais para fazer uma ligação inicial; se a sua carga de trabalho é tal que você espera mais do que um GET a cada cinco segundos ou assim, você vai ser mais feliz com uma conexão de pé.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top