Pergunta

Eu criei um aplicativo do MS Access 2003, configurado como uma configuração dividida front-end / back-end, com um grupo de usuários de cerca de cinco pessoas. O .mdb extremidade dianteira fica em um servidor de arquivos de rede, e que contém todas as consultas, formulários, relatórios e código VBA, além de links para todas as tabelas no mdb de back-end e alguns links para fontes de dados ODBC como um AS / 400. O back-end se senta no mesmo servidor de arquivos de rede, e ele só tem os dados da tabela nele.

Este estava funcionando bem até que eu "foi ao vivo" e meu punhado de usuários começaram a subir com solicitações de melhoria, relatórios de bugs, etc. I foram desenrolando novo código através do desenvolvimento / testes na minha própria cópia do front-end .mdb em outro pasta de rede (que é ligado ao mesmo back-end mdb), em seguida, postar meu arquivo concluída em um "come-e-get-it" pasta, alertando os usuários, e eles vão copiar / colar o novo arquivo de front-end para suas próprias pastas na rede. Desta forma, cada usuário pode atualizar sua extremidade dianteira, quando eles estão em um 'ponto de parada' sem ter que inicializar todos de uma vez.

Descobri que quando eu estou desenvolvendo agora, por vezes, acesso torna-se extremamente lento. Como, quando eu estou desenvolvendo um formulário e tentar clicar em um drop-down na caixa de propriedades, na seta drop-down vai empurrar, mas vai demorar alguns segundos antes de a lista de opções aparece. Ou há toneladas de lag em selecionar e mover os controles em um formulário. Ou lotes de lag teclado.

Então, em outras vezes, não há nenhum atraso em tudo.

Eu estou querendo saber se é porque eu estou ligado para o mesmo fim para trás como os outros usuários. Fiz um esforço razoável para configurar as consultas, formulários, relatórios, etc., com mínima bloqueio de registro, se houver algum, dependendo da necessidade. Mas eu possa ter perdido algo, ou talvez haja algum outro problema de desempenho que eu preciso de endereço.

Mas eu estou querendo saber se existe uma maneira ainda melhor para eu montar o meu próprio .mdb desenvolvimento back-end, para que eu possa estar testando meu código em dados "seguros" em vez dos mesmos dados ao vivo como o resto dos usuários. Tenho medo de que ele é apenas uma questão de tempo antes que eu corrupto alguns dados, provavelmente no pior momento possível.

Obviamente, eu poderia simplesmente criar um mdb de back-end separado e reconfigurar manualmente as ligações da tabela na parte frontal de cada vez, usando o Gerenciador de tabelas vinculadas. Mas eu estou esperando há uma solução mais elegante do que isso.

E eu estou querendo saber se existem outros problemas de desempenho que eu deveria estar a pensar neste multi-usuário, configuração de banco de dados de divisão.

EDIT: eu deveria ter acrescentado que eu estou preso com MS Access (não MS-SQL ou qualquer outro "real" back-end); para mais detalhes, ver o meu comentário a este post.

Foi útil?

Solução

Se todos os seus usuários estão compartilhando o front-end, que é a configuração errada.

Cada usuário deve ter uma cópia individual do front-end. Compartilhando um front-end é garantido para levar à corrupção freqüente de front-end compartilhado, bem como corrupções ímpares de formulários e módulos na extremidade dianteira.

Não é claro para mim como você poderia estar desenvolvendo na mesma cópia do front-end que os usuários finais estão usando, desde o início com A2000, que é proibido (por causa do "Salvar modelo monolítico", onde todo o VBA projeto é armazenado em um único campo BLOB em um único registro em uma das tabelas do sistema).

Eu realmente não acho que os problemas são causados ??por usando os dados de produção (embora provavelmente não é uma boa idéia para desenvolver contra os dados de produção, como já foi dito). Eu acho que eles são causados ??por práticas de codificação pobres e falta de manutenção de seu código de front-end.

  1. desligar compilar a pedido nas opções VBE.

  2. Certifique-se que você precisa opção explícita.

  3. compilar o código com frequência, após cada poucas linhas de código -. Para fazer isso fácil, adicionar o botão de compilação para sua barra de ferramentas VBE (enquanto eu estou nele, eu também adicionar o botão Call Stack)

  4. periodicamente fazer um backup do seu front-end e descompilar e recompilar o código. Isso é feito com o lançamento de Acesso com a chave / decompile, abrindo a sua extremidade dianteira, fechando Access, abrindo o seu front-end com o Access (com a tecla SHIFT pressionada para ignorar o código de inicialização), então a compactação do descompilados front-end (com a tecla SHIFT tecla premida), em seguida, compilar todo o projecto e compactar uma última vez. Você deve fazer isso antes de qualquer liberação de código principal.

Alguns outros pensamentos:

  1. você não diz se é um servidor Windows. servidores Linux acessados ??SAMBA tem problemas expostos no passado (embora algumas pessoas juram por eles e dizer que eles são muito mais rápido do que servidores Windows), e historicamente servidores Novell têm necessidade de ter configurações otimizadas para permitir arquivos Jet a ser editado de forma confiável. Há também algumas configurações (como OPLOCKS) que podem ser ajustadas em um servidor Windows para fazer as coisas funcionam melhor.

  2. armazenar seus MDBs Jet em ações com caminhos curtos. \ Server \ Data \ MyProject \ MyReallyLongFolderName \ Access \ Databases \ vai ser muito mais lento lendo dados do que \ Server \ Databases. Isso realmente faz uma diferença enorme.

  3. tabelas vinculadas armazenar metadados que podem se tornar desatualizados. Há dois passos simples e uma uma drástica a serem tomadas para corrigi-lo. Em primeiro lugar, compactar o back-end e, em seguida, compactar o front-end. Isso é o mais fácil. Se isso não ajudar, eliminar completamente as ligações e recriá-los do zero.

  4. Você também pode considerar a distribuição de um MDE para seus usuários finais em vez de um MDB, como ele não pode uncompile (que um MDB pode).

  5. Tony Toews para outras informações desempenho generalizado .

Outras dicas

1) mesas Relink acesso a partir de código http://www.mvps.org/access/tables/tbl0009.htm

Uma vez que eu estou pronto para publicar um novo MDE para os usuários I vincular novamente as tabelas, fazer a MDE e copiar o MDE para o servidor.

2) I especificamente criado o utilitário gratuito Auto FE Updater para que eu pudesse fazer alterações na FE MDE tão frequentemente como eu queria e ser bastante confiante de que a próxima vez que alguém foi para executar o aplicativo que iria puxar o mais recente versão. Para mais informações sobre os erros ou o utilitário Auto FE Updater ver o utilitário gratuito Auto FE Updater em http://www.granite.ab.ca/access/autofe.htm no meu site para manter a FE em cada PC até à data.

3) Agora, quando se trabalha no local, um clientes eu faço as atualizações para a estrutura da tabela depois de horas quando todos estão fora do sistema. Veja COMO: Detecção utilizador Tempo ocioso ou inatividade no Access 2000 (Q210297) http://support.microsoft ? .com / kbid = 210297 ACC : How to Detecção utilizador Tempo ocioso ou inatividade (Q128814) http://support.microsoft.com/?kbid=128814

No entanto, achamos que o código que é executado no evento timer deve ser desativado para os programadores. Caso contrário, coisas estranhas começam a acontecer quando você está editando código.

Além disso visualização de impressão, por vezes, não permitiria que os usuários executem um item de menu para exportar o relatório para o Excel ou outros. Então você tinha que clicar sobre o relatório Previewed para obter algum tipo de volta foco interno sobre o relatório para que pudessem, em seguida, exportá-lo. Isso também foi ajudado por estender o temporizador para cinco minutos.

A desvantagem de aumentar o temporizador para cinco minutos era se uma pessoa permanece na mesma forma e ao mesmo controle de partes consideráveis ??do dia, ou seja, alguém fazendo as mesmas perguntas, a rotina não percebi que eles tinham, na verdade, feito alguma coisa. Eu vou estar colocando em algum algum lógica para o contador foi reiniciado sempre que fazer algo no programa.

4) Em referência a outra pessoa comentando sobre scripts e tal para atualizar o esquema veja Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm . Enquanto ele tem suas peculiaridades que faz criar o código VBA para atualizar tabelas, campos, índices e relacionamentos.

Use VBA para desvincular e re-ligar as suas tabelas para o novo alvo quando se muda de dev para prod. Tem sido a muitos anos para me lembrar a sintaxe -. Eu só sei a função era simples de gravação

ou utilização MS-Access para falar com MS-Access através do ODBC, ou alguma outra conexão de dados que vidas fora do mdb cliente.

Tal como acontece com todos os bancos de dados de base de arquivos, você acabará por correr em problemas com uso de pico ou quando você passar por cima de um número mágico pequeno em algum lugar entre 2 e 30.

Além disso, acesso tende a corromper com freqüência, para backup, necessidade compacto e reparo a ser feito em uma base freqüente. 3ª parte ferramentas usadas para existir para automatizar esta tarefa.

lado do cliente tanto quanto o desempenho vai, os dados estão sendo processados, assim você pode querer usar algo como Netmeter de ver o quanto de dados está passando por cima do fio. O mesmo princípio sobre indexação e evitando tabela scans aplica a dbs base de arquivo também.

Muitas sugestões boas de outras pessoas. Aqui está a minha 2 millicents pena. Meus dados backend está no servidor acessado através de um mapeamento de unidade. No meu caso, o Y conduzir. usuários de produção obter o mapeamento através de um script de login usando o Active Directory. Em seguida, os seguintes cenários são facilmente feito pelo arquivo de lote:

  • Desenvolver contra computador local, fazendo um comando subst em um arquivo de lote
  • executar relatórios com os dados das últimas noites, apontando Y para o servidor de backup (somente leitura)
  • relatórios contra fim dos dados mês executar apontando para o diretório direito
  • teste contra cenários especializados, mantendo um diretório especial

No meu ambiente (média de 5 usuários simultâneos, 1000, de linhas, e não 10.000 das.) A corrupção tenha ocorrido, mas é raro e gerenciável. Apenas uma vez nos últimos anos tem recorremos à dias de backup anterior. Nós usamos o SQL Server para nosso material volume maior, mas não é o mais conveniente para desenvolver contra, provavelmente porque não temos um administrador de SQL no local.

Você também pode encontrar algumas das respostas para esta questão (como extrair esquemas de acesso) para ser útil também. Uma vez que você extraiu um esquema utilizando uma das técnicas que foram sugeridas você ganha toda uma gama de novas opções como a capacidade de controle de origem utilização nos esquemas, bem como ser capaz de facilmente construir ambientes de teste "limpas".

Editar para responder a comentário: Não há nenhuma maneira fácil de controle de origem um banco de dados em seu formato nativo, mas arquivos de esquema são apenas arquivos de texto como qualquer outro. Assim, você pode vê-los dentro e fora do software de sua escolha para fácil controle de versão / reversões de controle de origem.

Ou claro, depende de você ter uma série de scripts configurados para re-construir seu banco de dados a partir do esquema. Uma vez que você faz, é normalmente bastante trivial para criar uma versão opção / alternativa que reconstrói-lo em um local diferente, que lhe permite construir ambientes de teste a partir de qualquer versão comprometido anterior do esquema. Espero que esclarece um pouco!

Se você quiser atualizar o esquema do MDB back end automaticamente quando você lançar um novo FE para os clientes, em seguida, ver Compare'Em http://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htm terá todo o prazer gerar a necessidade de código VBA para recriar uma MDB . Ou o código para criar as diferenças entre dois MDBs que você possa fazer um upgrade de versão do MDB BE já existente. É uma peculiar pouco, mas funciona.

Eu uso isso o tempo todo.

Você precisa entender que um arquivo mdb compartilhada para os dados não é uma solução robusta. Microsoft sugere que o SQL Server ou algum outro banco de dados baseado em servidor seria uma solução muito melhor e que permitem que você use o mesmo fim de acesso frontal. O assistente de migração iria ajudá-lo a fazer a mudança se você queria ir por esse caminho.

Como outros usos apontou, a corrupção irá ocorrer. É simplesmente uma questão de como, muitas vezes, não se.

Para entender os problemas de desempenho que você precisa entender que para o servidor o arquivo mdb com os dados é simplesmente isso, um arquivo. Desde há código é executado no servidor, o servidor não entende transações, gravar bloqueio etc. Ele simplesmente sabe que há um arquivo que um monte de pessoas estão tentando ler e escrever simultaniously.

Com um sistema de banco de dados como SQL Server, Oracle, DB2. MySQL etc. O programa de banco de dados é executado no servidor e olha para o servidor como um único programa acessando o arquivo de banco de dados. É o programa de banco de dados (em execução no servidor) que lida com registro de bloqueio, transações, concorrência, registro, backup de dados / recuperação e todas as outras coisas boas que se quer a partir de um banco de dados.

Uma vez que um programa de banco de dados projetado para ser executado no servidor é projetado para fazer isso e só isso, ele pode fazê-lo muito melhor e mais efficently que um programa como o acesso a leitura de um escrevendo um arquivo compartilhado (mdb).

Há duas regras para o desenvolvimento em relação aos dados ao vivo

A primeira regra é. . . nunca desenvolvem com dados ao vivo. Nem nunca.

A segunda regra é. . .Nunca desenvolver com dados ao vivo. Nem nunca.

Você pode programaticamente alterar as ligações para tabelas vinculadas, para que possa escrever uma macro para mudar seus links quando você estiver implantando uma nova versão.

A aplicação é lento porque de MS Access, e não como muitos usuários simultâneos (onde muitos é qualquer número> 1).

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