Pregunta

Para un pequeño proyecto que he necesidad de utilizar una base de datos sencilla con muy poquito requisitos:pocas mesas, no es más que unos miles de registros en total, 2 o 3 usuarios.Estoy trabajando en .Ambiente de RED.

Como un servidor de base de datos (incluso las ediciones Express) parece de una enorme exageración, en este caso, una muy simple de base de datos MDB podría hacer para la mayoría de los requisitos.Sin embargo, estoy preocupado por la concurrencia.Mi idea es colocar el .mdb archivo en un recurso compartido de red y permiten a los usuarios acceder a este archivo desde su .En la RED de los clientes.El db está destinada principalmente a las operaciones de sólo lectura, pero los usuarios ocasionalmente será necesario actualizar o eliminar registros.Si esto no será posible en el tiempo (debido a la base de datos está bloqueado o lo que sea), me puedo sostener las actualizaciones en el cliente y en el proceso de ellos en un momento posterior.

La pregunta en sí misma, va a lo largo de estos puntos:

  • Cómo son lecturas simultáneas manejado en MDB?
  • Cómo son concurrentes actualizaciones o eliminaciones manejado en MDB?
  • Hay un concepto de cerraduras y cómo puedo aprovecharlo en una .NET app?
  • Es colocar el archivo MDB en un recurso compartido de red buena o idea horrible?

Como estoy trabajando en .NET, también me gustaría saber cómo puedo detectar cualquier tipo de problemas de simultaneidad y tomar la acción apropiada.I. e., que la excepción debo coger y qué medidas recomendaría usted a tomar?

EDITAR:Puede ser mi mala descripción del problema, pero la mayoría de las respuestas parecen aconsejar que va para un completo servidor de DB.Yo no entiendo las diferencias y beneficios de tener un servidor de instalación y, de hecho, han implementado un buen número de proyectos en MSSQL y Oracle.En esta pregunta, sin embargo, sólo me interesan Acceso y sus problemas de concurrencia, por lo que no sugieren un servidor de db.

Gracias por tu ayuda.

¿Fue útil?

Solución

Esta es una vieja cuestión, pero nadie ha hecho, respondió.Aquí están las preguntas:

  1. Cómo son lecturas simultáneas manejado en MDB?
  2. Cómo son concurrentes actualizaciones o eliminaciones manejado en MDB?
  3. Hay un concepto de cerraduras y cómo puedo aprovecharlo en una .NET app?
  4. Es colocar el archivo MDB en un recurso compartido de red buena o idea horrible?

Las dos primeras preguntas, básicamente, se puede responder con una explicación.Una de las claves advertencia aquí:las respuestas que me estoy dando aquí son específicos a Chorro de bases de datos (y sus variantes) y no completamente aplicar el nuevo formato de archivo incluye a partir de A2007, es decir, formato ACCDB.No he explorado a fondo las implicaciones de la eliminación de Jet ULS de la ACE y algunos de los comentarios que figuran a continuación puede asumir Jet ULS debajo de la capucha.Para un montón de cosas, sin embargo, se puede sustituir el "archivo LACCDB" por "archivo LDB" y el resultado será el mismo.

1-2) lecturas Simultáneas/actualizaciones/elimina

El Jet motor de base de datos es a menudo referido como un "servidor de archivos" de la base de datos en que no hay servidor del lado del demonio gestión de e/S con los archivos de datos en el servidor.Lo que esto significa es que todos los clientes mediante un Chorro de MDB está leyendo el archivo directamente.

Que es, por supuesto, una receta para el desastre si no hay algún mecanismo incorporado para la manipulación simultánea de acceso al archivo.

Jet se utiliza un bloqueo de registro de archivo, donde si el MDB es "Miarchivo.MDB" el bloqueo de registro de archivo en la misma carpeta y se llama "Miarchivo.LDB".El archivo LDB registros de lo que Jet ULS usuarios tienen el archivo MDB abrir, lo de la estación de trabajo que el usuario está conectado, y toda la información necesaria para la negociación de los problemas de concurrencia.

Ahora, para aquellos que cortar los dientes de cliente/servidor de motores de base de datos, esto puede parecer primitivo y peligroso, pero en el momento en que el Chorro de motor de base de datos fue desarrollada, su propósito era ser utilizado como una base de datos de escritorio motor para pequeños grupos de trabajo, y que estaba compitiendo con otros de escritorio motores de base de datos como xBase y la Paradoja, de la que ambos utilizan análogos de bloqueo de archivos para administrar el uso simultáneo de archivos de datos de varios clientes.

Dentro de un archivo de base de datos, se aplican bloqueos en las páginas de datos (que en el Jet 4 se incrementaron a 4K, mientras que en el Jet 3.x y antes, eran 2K), o en el nivel de registro si la tabla de datos fue creado originalmente para el uso de bloqueo de nivel de registro.En los primeros días de Jet 4, bloqueo de nivel de registro fue encontrado por muchos para ser bastante lento, especialmente cuando se utiliza el bloqueo pesimista, por lo que muchos de los desarrolladores de Access nunca usado nada, pero el bloqueo de páginas (@David Fenton levanta la mano!).

De hecho, cuando se utiliza el bloqueo optimista, a evitar la mayoría de los problemas de concurrencia que vendría con el bloqueo pesimista.

Algunas advertencias:

  1. de DAO, bloqueo de nivel de registro no está disponible, y sólo puedes conseguir el bloqueo de página.

  2. de DAO, hay una serie de opciones para controlar el optimista/pesimista de bloqueo, en particular, el argumento LockEdits del método OpenRecordset, sino que también interactúa con ciertos de la configuración especificada en el OpenRecordset Opciones argumento (por ejemplo, la Opción dbReadOnly no se puede utilizar con LockEdits).Además del bloqueo, también hay opciones para coherente/incoherente actualizaciones, y todo esto puede interactuar con las transacciones (por ejemplo, los cambios dentro de un uncomitted transacción no va a ser visible para otros usuarios y por lo tanto no entre en conflicto con ellos, pero se puede poner sólo lectura bloqueos en las tablas implicadas).

De ADO/OLEDB, estas Jet concurrencia de las estructuras de control van a ser asignados a las funciones correspondientes, y los argumentos se encuentran en ADO/OLEDB.Desde que tengo uso de Chorro único de Acceso, de interactuar con él sólo a través de DAO, por lo que no puede asesorar sobre la forma de controlar estos con ADO/OLEDB, pero el punto es que la base de datos Jet ofrece el control de su registro de bloqueo cuando se obtiene acceso mediante programación (como oposición a través del Acceso a la interfaz de usuario) -- es más complicado.

3) Cerraduras y .NET

Yo no puedo ofrecer ningún consejo aquí, aparte de que te gustaría es probable que utilice OLEDB como su interfaz de datos, pero el punto es que la funcionalidad de bloqueo de control que hay en el motor de base de datos en sí, por lo que es probable que haya una manera de controlarlo a través de OLEDB.Puede que no sea bastante, a pesar de que, como a mí me parece que OLEDB está diseñado alrededor de cliente/servidor de arquitecturas, y Jet del archivo de cierre no podrá mapa en que en una forma elegante.

4) MDB en un recurso compartido de red

Jet es muy sensible al más mínimo contratiempo en cualquier conexión de red.Debido a que, redes de baja velocidad puede aumentar la vulnerabilidad de las bases de datos Jet abierto a través de una conexión lenta.

Esto es debido a las grandes trozos del archivo de base de datos tiene que ser tirado a través de la conexión a la RAM del ordenador local para su procesamiento.Ahora, muchas personas erróneamente afirman que todo el archivo MDB se tira a través de la red, o que toda tablas se tira a través del alambre.Esto no es cierto.En su lugar, Jet primer solicitudes de los índices (y las solicitudes de no más de los necesarios para realizar la consulta) y, a continuación, a partir de que el resultado determina exactamente qué páginas de datos son necesarios y, a continuación, extrae sólo esas páginas.Esto es sorprendentemente eficiente y rápido.

También, Jet hace algunos muy inteligentes de almacenamiento en caché que puede significar que una primera solicitud de datos puede tomar un tiempo, pero las solicitudes posteriores de los mismos datos pasan casi instantáneamente porque de almacenamiento en caché.

Ahora, si usted no ha indexado sus mesas bien, puede acabar tirando toda la tabla y hacer un análisis completo de la tabla.Del mismo modo, si usted criterios de la base en el lado del cliente funciones que no son parte de la Jet del dialecto SQL, usted podría terminar tirando de una tabla completa (clasificación de, por ejemplo, Reemplazar(MyField, "A", "Z") es probable que cause un análisis completo de la tabla).Pero que clase de cosa que va a ser ineficiente y con una arquitectura cliente/servidor, demasiado, así que es sólo de sentido común, el diseño del esquema para indexar las cosas bien y tener cuidado con el uso de Udf o no-Jet compatible con las funciones.En general, las mismas cosas que son eficientes con el cliente/servidor va a ser eficiente con Jet (la principal diferencia es que con el Jet es mejor que con una conexión persistente con el fin de evitar la sobrecarga de volver a crear el archivo LDB, lo que es significativo).

La otra cosa a evitar es tratando de uso de datos de Jet a través de una conexión WiFi.Todos sabemos lo poco confiable WiFi, y es simplemente pidiendo problemas tratando de trabajar con datos de Jet a través de una conexión WiFi.

La parte inferior de la línea:

Si usted está usando un MDB como un almacén de datos para la publicación de datos desde un servidor web, usted debe poner los datos como cierre a la web del servidor de RAM como sea posible.Eso significa que, cuando sea posible, en un volumen de disco que se adjunta a la física del servidor web.Donde eso no es posible, usted quiere una manera rápida, confiable de la conexión LAN.GB Lan en los centros de datos son algo bastante común en estos días y me gustaría ser muy cómodo trabajando con datos de Jet a través de ese tipo de conexión.

Para el uso compartido, por ejemplo, múltiples estaciones de trabajo cliente ejecuta un VB.NET aplicación de escritorio para compartir un solo avión MDB como almacén de datos, es bastante seguro que el archivo de datos en un fiable servidor de archivos.Donde sea posible, es una buena idea poner su Jet archivos MDB en las máquinas que no son de servir a múltiples propósitos (por ejemplo, el controlador de dominio que ejecuta Exchange, SQL Server y que actúa como servidor de archivos y el servidor de impresión puede no ser la mejor ubicación).Aplicaciones como Exchange mal puede interferir con el archivo de la funcionalidad de un servidor, y me gustaría suelen recomendar nunca colocar los archivos MDB en un servidor que es la multitarea como un servidor de Exchange a menos que sea extremadamente bajo volumen.

Otras consideraciones:

  1. nunca trate de distribuir un MDB en una replica del sistema de archivos, a menos que todos los usuarios están utilizando la misma réplica.Es decir, si tienes dos servidores de replicar archivos entre ellos, ni siquiera pensar en la edición del archivo MDB de ambos servidores.Esto dañará el archivo casi de inmediato.

  2. Yo recomendaría contra almacenar cualquier MDB en otra cosa que un sistema de archivos nativo de Windows se sirve a través de los nativos de Microsoft SMB de redes.Esto significa que no hay Novell, Linux no, no SAMBA.La razón principal de esto es que hay, aparentemente, enlaces de bajo nivel de Jet en algunos de bajo nivel de la funcionalidad de bloqueo en el sistema de archivos de Windows que no son 100% replicado en otro archivo systsm.Ahora, yo soy muy conservador en esto, y muchos competente el Acceso a los desarrolladores han reportado excelentes resultados con apropiadamente configurado, Novell servidores de archivos (a menudo hay necesidad de algunos de bloqueo de registro de los ajustes, a pesar de que puede ser menos relevante en estos días, ni siquiera sé si Novell existe más!), y un rendimiento espectacular con Linux basada en servidores de archivos con SAMBA.Soy cauteloso sobre este y se lo recomendaría a cualquier cliente en su contra (esto incluye varios dispositivos SAN, así, ya que no muchos de ellos están basados en Windows).

  3. Yo nunca iba a ejecutar en cualquier sistema de archivos virtualizado por las mismas razones.Sin embargo, tengo un cliente que ha sido la ejecución de su único Acceso de usuario de la aplicación bajo Parallels en Mac Aire durante varios años sin un solo problema.Pero es el único usuario, por lo que el bloqueo de temas van a ser relativamente menor.

Yo no sé si eso responde tu pregunta o no.Todo se basa en mis 13 años de uso regular de Jet como un Acceso de desarrollador y estudio del único libro publicado en Jet, Jet Motor de Base de datos Guía de Programadores (por Jet 3.5 solamente).No he proporcionado real de las citas, pero si alguien necesita algunos detalles sobre todo lo que he dicho, voy a hacer la investigación si puedo.

Otros consejos

He construido una docena de aplicaciones de modo de pequeñas empresas en el acceso a través de los años. La mayoría tienen un máximo de 10-20 usuarios en ellos a la vez. Las bases de datos se dividen entre una "aplicación" y una base de datos "Datos". El rendimiento es decente y no hay problemas con concurrancy. También la corrupción ha sido básicamente inexistente ya que el acceso 2000 SP2.

Hay una gran cantidad de personas que dicen "no vuelvas a utilizar Access" - bien si se hace bien (es decir, por un desarrollador profesional) El acceso es absolutamente un paquete de desarrollo bien y he hecho una buena vida en ello. Mis clientes están muy contentos con lo que he construido.

He escrito dos productos comerciales que utilizan una base de datos, que va desde un recurso compartido de red, por lo general hasta 10 usuarios. Si no abusar de ella, no hay realmente ningún problema; pero como se puede ver muchos desarrolladores no siempre llegan allí - y debido a su naturaleza de gama baja, hay una gran cantidad de hacks cutres construidas sobre ella. En el caso de un producto, que tenía que rediseñar la aplicación debido a todos los problemas descritos en detalle por otros; pero después me limpié, nunca he tenido un problema de integridad de base de datos a través de cientos de instalaciones.

Su una gran ventaja es la base de datos de una sola fila, que es fácil de copia de seguridad, restaurar y copiar a su ordenador portátil para diseccionar. Casi todas las alternativas, incluyendo sqlite (aunque algunos no admitirlo), requieren algún tipo de atención DBA vez en cuando.

En la mayoría de los casos, Access proporciona bloqueos de registro, y los bloqueos de archivo para algunos DDL (por ejemplo, cambios en el esquema) de forma predeterminada.

Sin embargo, Microsoft está básicamente obsoleto a ella, y algunos de sus colegas se amontonarán burla de usted para usarlo.

(En este punto, normalmente a cubierto y gritar "ENTRANTE !!!".)

El acceso es realmente un escritorio, una solución de un solo usuario. En la práctica, tiene un límite de usuarios superior de "uno".

También es un motor local. Es decir, cuando se ejecuta una consulta, los datos son tomados a través de la red al motor a reacción local para su procesamiento. Un archivo .ldb se coloca en la red compartida para cerraduras de control.

Si utiliza un motor del lado del servidor (MSSQL, MySQL, Sybase, 'Orable etc), entonces se envía una consulta a un motor que lo procesa y devuelve los resultados a usted. Los bloqueos se llevan a cabo internamente.

Esto tiene enormes implicaciones para el rendimiento, la estabilidad y la integridad de los datos.

Si el usuario decide que pulsar el botón de reinicio, el DATABSE de acceso tiene una oportunidad justa de ser corrompido y que tendrá que eliminar la .ldb.

Con un motor de base de datos adecuada (MSSQL, Sybase, 'Orable: que no me gustan las copias de seguridad de MySQL), entonces también una capacidad de copia de seguridad adecuado. A menos que tenga algún tipo de software de copia de seguridad whizzy inuse archivos, es posible que usted no tiene copias de seguridad de ustedes datos en la base de datos de acceso.

he mencionado cerraduras específicamente porque un motor de base puede manejar la concurrencia y la transacción mucho más eficiente y elegante que cualquier sistema basado en archivos.

Puedo ver utilizando un proyecto de Access como un front-end para un motor de base de datos, pero no invertir en una aplicación de cliente completo con una base de acceso.

He estado usando el acceso, o más correctamente, Jet como un back-end en un sitio muy pequeño y privado que no puede crecer, ya que está limitada por el tamaño de una profesión en este pequeño país. En tres años no he tenido ningún problema. Hay menos de 100 usuarios, con aproximadamente treinta a cuarenta utilizando todos los días. Las mesas tienen unos pocos miles de registros.

No tengo mucha experiencia con el acceso, pero este enlace puede ser útil para usted:

http://office.microsoft.com/en-us/access /HP052408601033.aspx

"Usted puede poner toda la base de datos de Access en un servidor de red o en una carpeta compartida. Este es el método más fácil de implementar. Todo el mundo comparte los datos y utiliza los mismos formularios, informes, consultas, macros y módulos. Utilice esta estrategia si desea que todos puedan usar la base de datos de acceso de la misma manera o si no se puede apoyar a los usuarios crear sus propios objetos ".

"Al abrir un archivo de base de datos Access (.mdb) en modo compartido, Microsoft Access también crea un archivo de información de bloqueo (.ldb) con el mismo nombre de archivo (por ejemplo, Neptuno.ldb) y en la misma carpeta que el archivo de base de datos. este archivo de información de bloqueo almacena el nombre del equipo (como mypc) y el nombre de la seguridad (como Administrador) de cada usuario compartida de la base de datos. Microsoft Access utiliza esta información para controlar la concurrencia. En la mayoría de los casos, Microsoft Access elimina automáticamente el archivo de información de bloqueo cuando el último usuario cierra el archivo de base de datos ".

El acceso se supone que es multi-usuario - Creo que Microsoft lo recomiendo para un máximo de 4 o 5 usuarios, pero en la práctica que recomiendo que no utilice nunca una base de datos donde hay más de un solo usuario, aunque si que realmente no tiene la opción es aceptable para dos o tres, dada ciertas condiciones.

He tenido experiencia de cuatro o cinco sistemas que utilizan una base de datos de back-end - todos adquiridos de otros desarrolladores '' - y en todos los casos les hemos trasladado a SQL Server como una prioridad después de las actualizaciones inmediatas y correcciones necesarias al tomar el contrato - en general, tan pronto como pude hablar el jefe de pagar la cuenta en él. lapso de tiempo para que por lo general es de varios meses, por lo que he visto en funcionamiento simultáneo de un período razonable de tiempo y en varias aplicaciones diferentes.

En realidad, por lo general funciona aceptablemente bien si el sistema no tiene una gran cantidad de inserciones concurrentes / actualización y no se utiliza en gran medida. Los principales problemas prácticos en mi experiencia son ..

  1. Es probable que la corrupción - simplemente lo hace. Por lo general esto no es demasiado de un problema, ya que al abrir el archivo y en funcionamiento compacto y reparación será resolver los problemas, pero un buen régimen de copia de seguridad es absolutamente esencial.

  2. Es lento. Cada vez que he actualizado un sistema para SQL Server he recibido una gran cantidad de felicitaciones para acelerar el sistema de los usuarios.

  3. El archivo de base de datos se hincha debido a la forma en que Access marca como registros actualizados o eliminados. Esto ralentiza aún más el sistema que el archivo tiene que ser cargado a través de la red. En consecuencia alguna régimen que comprime los datos, por lo general sobre una base diaria, es esencial.

Todo lo anterior son mucho menos de un problema con los sistemas de un solo usuario como los problemas subyacentes que impulsan estos son mucho menos prominente.

Con todo, debo enfatizar que nunca recomendaría acceso para cualquier sistema multi-usuario. Sin embargo, si realmente tienen también probablemente obtendrá lejos con él, siempre y cuando se trata de una aplicación que se utiliza a la ligera y que haga instituir los procedimientos de copia de seguridad y mantenimiento.

Ya ha sido manifestó varias veces para utilizar un multi-usuario real, la plataforma de base de datos libre. Pero una de las razones por las cuales no se ha establecido. Esta razón es, ¿cuántos existente,,, grandes bases de datos Access molestos desordenado haber comenzado como "unos pocos registros, uno o dos usuarios max"? Me atrevería a decir que todos ellos.

A menos que sólo hay dos o tres empleados en toda la empresa, lo más probable es que si usted desarrolla una pieza útil de software, que va a ser utilizado con el tiempo en más de la original de dos o tres usuarios, tienen más que el original unos cuantos miles de registros, y se expandirán en los últimos años para incluir muchas formas, muchas más tablas, y mucho más datos. No se puede rehacer la fundación de una casa una vez que la casa está construida. Construir una base fuerte hoy en día, y se puede ampliar la casa a su gusto. Lo mismo para el software.

Cuando se va con un recurso compartido de red que iría con una red habilitada para la base de datos (MySQL / Firebird / mssql) en lugar de acceso.

En la situación de su acceso usando la descripción no sería un problema.

He utilizado acceso en situaciones más difíciles, entonces esto sobre todo cuando se trabaja con sitios web de acceso cuando no se abuse allá de la medida que realmente no es tan malo de un motor de base de datos. (No estamos hablando de formas y cosas por el estilo sólo tablas y registros)

Cuando sus inserciones que hacen / actualizaciones / eliminaciones de varios usuarios a la vez y luego se pone un poco difícil. Este es el punto en el que comienza a pensar en los motores de bases de datos reales.

También cuando se desea una base de datos bajo costo operativo que es seguro para subprocesos se puede echar un vistazo a VistaDB (más lento que el acceso, no siempre libre, 100% .NET)

Creo que el acceso utiliza bloqueos a nivel de tabla con algún tipo de mecanismo queeing cosas deberían funcionar bien. Si estás preocupado por lo que siempre se puede tirar una prueba de estrés simulado a él.

Creo que se puede definir en la cadena de conexión de aplicaciones .NET. Busqué en Google para el JET, el acceso y bloqueo de registros

que podría ayudar.

Por favor, vea la respuesta aceptada para los detalles reales sobre cómo obtener acceso y JET datos.

Por favor, no utilizar el acceso para un escenario de múltiples usuarios.

He acaban de pasar por dos semanas de dolor porque mi predeccessor en un proyecto eligió Access como un back-end.

razones concretas:

  • No hay tal cosa como LINQ-a-Acceso
  • El acceso tiene numerosas peculiaridades como dependencias en el orden de adición de los parámetros a los comandos que le llevará a las edades de depuración
  • El acceso no escala
  • actualizaciones de bases de datos son una tarea cuando se compara con el uso de SQL Server
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top