Pregunta

Tengo una base de datos Apache Derby ejecutándose (en modo de red) dentro de una aplicación Java Swing, me conecto a ella a través de llamadas JDBC directas a través de una aplicación cliente de Java.

Todo esto es muy bueno y funciona muy bien, sin embargo, sé que tengo un requisito adicional para implementar licencias concurrentes para esta aplicación cliente / servidor.

Idealmente, un usuario con una licencia de usuario único debería poder tener 1 aplicación cliente ejecutándose en una computadora portátil y también una segunda aplicación cliente ejecutándose en una computadora de escritorio y poder conectarse al servidor desde ambas.

No tengo el lujo de un servidor web, por lo que me pregunto si mi única opción es usar los '' maxthreads '' tiempo de ejecución en Derby y esencialmente obligan al usuario a tener que cerrar sesión en la computadora portátil y decir si quieren usar la aplicación desde su escritorio.

Si dejo la propiedad timeslice en 0, se realizará una llamada para que se agote el tiempo de espera de ConnectConnection para que pueda mostrar un mensaje al usuario explicando que deben desconectar una de las aplicaciones cliente.

¿Los hilos de conexión son una forma confiable de hacer esto?

¿Me falta otra solución?

¿Fue útil?

Solución

Si entiendo la pregunta correctamente, tiene licencias bloqueadas por el usuario y desea evitar que un solo usuario con una sola licencia acceda al servidor "". de más de una instancia del cliente a la vez. Su & ??quot; servidor " es simplemente una base de datos y no desea crear una capa de aplicación en el lado del servidor.

Realmente no me gusta su sugerencia inicial de utilizar el grupo de subprocesos y el tiempo de espera de conexión para imponer restricciones de licencia porque ambas cosas se usan para otros fines.

En cambio, para resolver esto, podría considerar pedirle al usuario que ingrese su número de licencia en la GUI la primera vez que lo use. Esto se puede guardar en el directorio de inicio del usuario para posteriores inicios de la GUI. Lo mismo sucedería si inician la GUI por primera vez en otra máquina. Luego, para cada transacción que realice la GUI con la base de datos, primero actualizará una tabla de licencias o similar para indicar que la licencia del usuario está participando actualmente en una transacción. Siempre que la misma licencia ya esté en la tabla, marcada como activa o similar, la GUI rechazará la transacción y mostrará al usuario que su licencia ya está en uso por otro cliente.

Si te gusta esta idea, piénsalo más lejos que yo. Puedo ver algunos errores en la lógica que bloquea a los usuarios permanentemente :-)

Otros consejos

Parece que desea realizar la acción de "iniciar sesión" y "cerrar sesión" de la base de datos explícita, por lo que quizás desee tener una tabla especial en la base de datos donde su aplicación escriba un registro cuando inicie o cierre sesión.

Entonces su aplicación puede consultar esa tabla para averiguar si otras copias de la aplicación están actualmente conectadas.

Es posible que desee incluir campos adicionales en la tabla para rastrear la fecha / hora cuando inició / cerró sesión, el nombre de host y la dirección IP del cliente que realizó el inicio de sesión / cierre de sesión, etc.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top