17

Tengo una aplicación que utiliza SQL Enterprise para almacenar todos los datos en 4 DB diferentes. Necesitaba incorporar la capacidad de trabajar "fuera de línea" para mis usuarios. Logré esto a través de Merge Replication a las instalaciones locales de SQL Express para todos. Esto "funciona", pero se siente como el enfoque de martillo.Sync Framework with SQL DB's: Primeros pasos

Por ejemplo, estoy replicando las 14000 personas en cada base de datos cuando un usuario individual solo puede interactuar SIEMPRE con un 100 aproximadamente. Eso ni siquiera cuenta el hecho de que NUNCA interactuarían con más de 5 ish entre las conexiones con los DB centrales.

Lo que estoy buscando son sugerencias, sugerencias y, tal vez, un buen tutorial sobre Sync Framework 2 (con bases de datos). Cuentas de primera mano sobre lo que funcionó para usted y por qué también sería muy bienvenido. Todavía tengo que encontrar un tutorial claro y conciso (sin mencionar el actual) para trabajar con Sync Framework.

Mis detalles son MS SQL Server 2005 o 2008, cualquier versión. Cualquier versión .Net (3.5 o 4). La capa de datos actual es todo LinqToSQL. Hay no cualquiera Sprocs actualmente en uso.

Mis pensamientos, hasta el momento, son sincronizar solo los casos de trabajo asignados y los datos asociados. Idealmente, iríamos directamente a un formato de "Check In/Check Out" en el que seleccionarán a los miembros a los que planean ir y luego sincronizarán los datos necesarios.

Como beneficio adicional, ¿podría alguien decirme a qué se refiere esto? Me encuentro con "Conectado ocasionalmente" todo el tiempo, pero parece inexacto. Sería más exacto llamarlos "Ocasionalmente DIS-Conectados", ¿pensamientos?

+0

Háganme saber si necesita más detalles, redacción o mejor enfoque. esto es muy importante para mi. –

+0

Estoy muy agradecido con todos aquellos que se han tomado el tiempo para responder. Estoy decepcionado con ** yo mismo ** por no haber redactado mejor mi pregunta, ya que las respuestas, hasta ahora, no abordan realmente mi preocupación. Editaré una vez más para intentar y ayudar esto. –

+0

Supongo que probablemente ya ha resuelto este problema, pero si no, puedo sugerir algunas maneras de usar Sync Framework 2.0 o 2.1 junto con sql 2005 o superior para solucionar esto. Implementé algo similar para una aplicación .NET 4 ocasionalmente conectada para 400 usuarios. – stombeur

Respuesta

0

Esto se llama esencialmente Distributed Computing.

En cualquier sistema que he trabajado, he utilizado típicamente un N-Tier Architecture para permitir la conexión ocasional de un programa de cliente al servidor de base de datos en el back-end para las operaciones CRUD. Cualquier trabajo que realice el cliente se considera sin conexión, ya que no interactúan con el servidor hasta que guarden sus cambios.

Al utilizar este tipo de enfoque, debería poder hacer una aplicación que les permita conectarse por un momento para obtener algunos datos, realizar algún trabajo sobre los datos y luego propagar cualquier cambio (CRUD) al servidor (base de datos) .

Tendría que decir que el uso de la réplica de Merge con las instalaciones de Local Sql Express es seguro un enfoque de martillo. No te sientas mal por eso, todos lo hacemos de vez en cuando: P.

EDITAR

No he utilizado Sync Framework mí mismo, pero parece agradable. Consulte Sync Framework Developer Center para obtener más información al respecto.

0

Me parece que Microsoft Sync puede ser una buena opción para ti. Hay una descripción general de la sincronización de bases de datos aquí, http://msdn.microsoft.com/en-us/sync/bb887608.aspx. Eche un vistazo y vea si satisface sus necesidades. Parece la solución perfecta para su problema.

+1

Gracias, lo he visto. Solo esperaba algo más en manos. Gracias por tu tiempo. –

0

La pregunta es, ¿su aplicación necesita ejecutarse en el dispositivo con datos desconectados almacenados localmente, o puede crear una versión móvil de una interfaz web porque se supone que siempre deben estar conectados a un servidor cuando trabajando con los datos?

Los proyectos en los que trabajaron en (hace mucho tiempo) utilizaron el marco compacto y ActiveSync, ya sea con un Access o SQL Server back-end porque era demasiado caro tener cada dispositivo conectado todo el tiempo, como un teléfono. Llevaron el dispositivo al campo, necesitaron acceder a los datos del db desconectado, hicieron sus modificaciones y se sincronizaron cuando volvieron a la oficina.

Si eso es lo que está haciendo, puede usar su deviceID para identificar qué casos/filas necesita cada dispositivo, pero si está pensando en desarrollar una solución de sincronización personalizada, creo que está librando una batalla equivocada. Eso ya se ha hecho. Use una solución de sincronización comprobada, limitaciones y todo, y concéntrese en los criterios que puede usar para limitar los datos sincronizados.

+1

Gracias por la respuesta. Mis usuarios estarán conectados, en la oficina, la mayor parte del tiempo y luego llevarán allí las computadoras portátiles al campo. Por lo general, sabrán de antemano qué datos necesitarán. Necesita ser datos persistentes, por lo que un DB local. No tendrán una conexión mientras estén en el campo. –

+0

Me sorprende que no quieran tabletas. La mayoría de las personas que llevan las computadoras portátiles al campo las encuentran engorrosas. Una vez más, usaría alguna solución de sincronización disponible libremente, aunque probablemente signifique que estás sincronizando más datos de los que realmente necesitan en el campo. La mayoría de las soluciones de sincronización son a nivel de tabla y campo, no a nivel de fila. – Beth

0

Parece que es necesario tener un mayor control sobre las opciones de datos que se fusionan. Con este requisito puedo ver que hay 2 tipos de datos; Datos que pertenecen a un miembro (el caso pertenece a un miembro) y datos compartidos (referencia, datos maestros).

tendría una mezcla de estas técnicas en este caso para hacer las cosas semi rápida.

Por ejemplo, los cambios maestros y datos de referencia no son tan frecuentes. Por lo tanto, no es necesario que sincronicemos con mucha frecuencia, sino que necesitamos controlar los cambios y debemos/debemos hacerlo en una ubicación central. En este caso, haría los cambios en mi base de datos central y usaría el enfoque Martillo de trineo.

Para los datos transaccionales, asumiendo una vez direccional, en este elemento de caja sólo puede cambiar casos/filas que pertenece a él/ella, se puede implementar utilizando muchas maneras.

Como se mencionó anteriormente, se puede utilizar el Centro de desarrollador de Sync Framework o ActiveSync.

Dado que los umbrales no son tan estrictas como en PDA o PC de bolsillo, podemos tryout un enfoque manual, así como tenemos ordenadores portátiles. Implementar una rutina de funcionalidad/proceso para conectar y enviar datos que se crean, actualizan y eliminan (en este caso, tenemos que mantener un indicador en el nivel db) utilizando las operaciones BulkCopy un enfoque más común en este escenario (necesidad de proporcionar un botón para que los miembros hagan clic e invocar, o un servicio para sondear y verificar la conectividad y comenzar la rutina de sincronización automáticamente).

/KP

1

Tengo un par de sugerencias y consejos que pueden o no ser obvias/útiles.

Para mí, esto suena como un problema que se puede dividir en 3 aspectos distintos:

proceso de sincronización

  • Definitivamente, usted debe asegurarse de que todas las filas tienen algún tipo de columna "last_update" para que su proceso de sincronización pueda determinar de manera eficiente y confiable qué datos ya están actualizados; de esa manera puede ser mucho más agresivo con la cantidad de registros que está sincronizando.
  • Evitaría tener un proceso de sincronización complejo y simplemente usar el enfoque de fuerza bruta siempre que sea posible. 14,000 registros no me parecen muchos; con optimizaciones puede encontrar que es posible sincronizar todos los cambios realizados entre conexiones en un tiempo razonable. De lo contrario, todavía seré bastante liberal con respecto a lo que sincronizas para evitar que los usuarios que trabajan con datos desactualizados se den cuenta.

Empujar los cambios realizados en el modo fuera de línea

Si es posible que probablemente simplemente no permitir cambios en el modo fuera de línea - que eso no es posible, entonces debería considerar empujando cambios como siendo como un separado (y probablemente bastante complejo) proceso en sí mismo.

sin saber más acerca de la aplicación es difícil de hacer buenas sugerencias sobre el proceso de sincronización es muy negocio depende, sin embargo, algunas cosas a considerar son:

  • concretamente los usos ser capaz de bloquear (o salida) de una elemento para evitar que otras personas lo cambien mientras trabajan fuera de línea?
  • ¿Debe ser posible anular la cerradura?
  • Si se overrided una cerradura, lo que debería ocurrir cuando alguien intenta guardar los cambios (un proceso de combinación parece una opción razonable)
  • En caso de que alguien sea capaz de editar un elemento que no se han comprobado?

Si decide implementar un proceso de cambios fuera de línea complejo, entonces puede que quiera echar un vistazo al flujo de trabajo utilizado en VCS distribuidos para obtener inspiración.

Cambio del almacén de datos fuera de línea

Usted puede encontrar usando SQL Compact o SQLite como almacén de datos local de una solución más elegante (que sería sin duda hará que el proceso de instalación más fácil), si está utilizando LINQ entonces yo' Probablemente se mueva a favor de SQL Compact, ya que definitivamente tiene soporte LINQ to SQL.

Me centraría en los dos anteriores primero ya que este cambio ofrece la menor cantidad de mejoras para el usuario final y es probablemente el trabajo más importante; los dos anteriores son completamente alcanzables mientras se usa SQL Server Express como almacén de datos local.

+0

Además, buena suerte :-) – Justin

0

Después de muchos días de luchar con el marco de sincronización, estoy considerando abandonarlo y simplemente escribir algunos servicios y códigos simples de WCF. Mis requisitos son bastante simples, una sincronización de SQL2008 a SQL CE en dispositivos móviles. Desde mi experiencia, es muy difícil de personalizar (solo sincronizar algunos campos, etc.) y es extremadamente lento e ineficiente. Creo que Microsoft necesita hacer un poco más de trabajo para que sea un poco más fácil de usar.

Saludos

Marcar

3

Nosotros hemos estado Sync Framework en un par de nuestros proyectos (uno con SQL Server, una con PgSQL), así que podemos decir que funciona bastante bien.

Consulte esta aplicación de tutorial para tener una idea de lo que puede hacer.

http://code.msdn.microsoft.com/sync/Release/ProjectReleases.aspx?ReleaseId=4835

Esto le mostrará cómo sincronizar los datos entre múltiples bases de datos de SQL Server. También puede personalizar los procedimientos almacenados de 'incrementos' para tomar parámetros personalizados y filtrar datos en función de estos parámetros (por ejemplo, las personas que el usuario-cliente está planeando visitar).

También sugiero que use un reflector para descompilar el código de Sync framework en caso de que vea errores extraños: a veces no es posible determinar dónde está el error hasta que vea la excepción atrapada en el código de la estructura. ¡Redgate funciona perfectamente para mí!

¡Avíseme si necesita más ayuda!

+0

BTW: el ejemplo dado es bastante detallado y muestra cómo funciona la sincronización con solo dos tablas en tres bases de datos diferentes (un servidor y dos clientes). Deberá manejar situaciones de inserción de clientes creando conflictos en las claves primarias; lo hicimos al tener secuencias muy diferentes en cada uno de los clientes. –

+0

Nota: Es probable que no pueda dar personas directamente, pero podrá mencionar los criterios de filtrado (¿ubicación ?, ¿cuenta?) En los incrementos SP. –

0

¿Ha intentado filtrar sus artículos de réplica de mezcla en el nivel de fila todavía? Esto reduciría el tamaño de tu fila de 14k a algo manejable.

Cuestiones relacionadas