Spanish [Solucionado] ¿Que debo modificar del lado cliente para que funcione jRDC2 Multi?

Sergio Castellari

Active Member
Licensed User
Situación:
Actualmente estoy desarrollando una APP donde utilizo jRDC2 (con sus respectivos jRDC2.bas y DBRequestManager.bas en B4A) y funciona PERFECTO.
Pero necesito conectarme con el mismo Server jRDC2 a multiples Bases de Datos.
@Erel publico el año pasado esta version de jRDC2 Multi que admite multiples Bases de Datos:
https://www.b4x.com/android/forum/threads/mysql-connector-for-b4i.116617/#post-729095
En su momento consulte por lo cambios que debia hacer en la APP local (B4A) para poder utilizar jRDC2 Multi.
Mi ignorancia no me permite darme cuenta qué debo modificar en jRDC2.bas / DBRequestManager.bas para que pueda enviar desde la APP en B4A, la Base de datos que quiero utilizar en jRDC2 Multi.
Saludos
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Situación:
Actualmente estoy desarrollando una APP donde utilizo jRDC2 (con sus respectivos jRDC2.bas y DBRequestManager.bas en B4A) y funciona PERFECTO.
Pero necesito conectarme con el mismo Server jRDC2 a multiples Bases de Datos.
@Erel publico el año pasado esta version de jRDC2 Multi que admite multiples Bases de Datos:
https://www.b4x.com/android/forum/threads/mysql-connector-for-b4i.116617/#post-729095
En su momento consulte por lo cambios que debia hacer en la APP local (B4A) para poder utilizar jRDC2 Multi.
Mi ignorancia no me permite darme cuenta qué debo modificar en jRDC2.bas / DBRequestManager.bas para que pueda enviar desde la APP en B4A, la Base de datos que quiero utilizar en jRDC2 Multi.
Saludos
La contestación que te daban en ese mismo hilo tenía muy buena pinta :

 

Sergio Castellari

Active Member
Licensed User
Hola @Gabino A. de la Gala ,
Me doy cuenta que debe estar "por ahi" el asunto (ese hilo ya lo he leido y re-leido varias veces, pero no logro "entenderlo").
Yo creo que debe ser algo "sencillo" del lado cliente.
Ahora, que ya tengo la APP en un estado bastante avanzado necesito poder tener esta funcionalidad.
¿Vos actualmente utilizas jRDC2 Multi?
Saludos y gracias!
 

EnriqueGonzalez

Well-Known Member
Licensed User
Longtime User
Hace algún tiempo cree una que funcionaba a través de puertos, si entrabas por el puerto 4000 se conectaba a la base a, en el puerto 4001 se conectaba a la base b, de esa forma no tenia que cambiar el dbrequestmanager, al final llamabas esta linea desde b4a:

Dim req As DBRequestManager = CreateRequest("base_a")

Digo te lo cuento a lo mejor te animas a meterle mano al jrdc2, el codigo no tiene nada de magia.
 

Sergio Castellari

Active Member
Licensed User
Hola @EnriqueGonzalez !
"ESE" es el tema: no me animo a meterle mano al jRDC2.bas !!!!...Actualmente esta funcionando PERFECTO pero "asociado" a una DB de desarrollo. No quiero "tocarlo" y que DEJE de FUNCIONAR! ja
Como bien menciono Gabino en un LINK (que ya he vuelto a releer no se cuantas veces!), no logro comprender lo que debo "editar" en jRDC2.bas
Esta claro que debe ser algo simple, ya que Erel en el momento que publicó jRDC2 Multi, no incluyó las modificaciones en el cliente (imaginando por que supuesto que son tan simples...)
Por lo poco que puedo entender "tu" metodo es diferente y requiere un puerto por cada DB.

Saludos
 

josejad

Expert
Licensed User
Longtime User
Pero necesito conectarme con el mismo Server jRDC2 a multiples Bases de Datos.

Hola Sergio, si las bases de datos están en el mismo servidor, es muy sencillo. Sólo tienes que hacer los cambios en el config.properties del servidor B4J.

Si te fijas en el ejemplo original de jRDC2, la cadena de conexión era:

B4X:
JdbcUrl=jdbc:mysql://localhost/test:3306?characterEncoding=utf8&useSSL=false

donde /test era el nombre de la base de datos.

En la cadena de conexión de mi ejemplo, que creo que es el que utilizas, es:

B4X:
JdbcUrl=jdbc:mysql://localhost:3306?characterEncoding=utf8&useSSL=false

Es decir, no se especifica ninguna base de datos, eso lo hacemos en el config.properties. Si te fijas, se especifican como:
B4X:
sql.getEvents = SELECT * FROM B4X.events WHERE `month` = ? AND `id_user` = ?

donde B4X es la base de datos a la que te conectas. Simplemente cambia ahí el nombre de la base de datos y ya está.

Se dio cuenta alguien de ese detalle, en este hilo, y como indica Don Manfred, las bases de datos deben tener un usuario con los mismo derechos.

saludos,
 

Gabino A. de la Gala

Active Member
Licensed User
Longtime User
Hola Sergio, si las bases de datos están en el mismo servidor, es muy sencillo. Sólo tienes que hacer los cambios en el config.properties del servidor B4J.

Si te fijas en el ejemplo original de jRDC2, la cadena de conexión era:

B4X:
JdbcUrl=jdbc:mysql://localhost/test:3306?characterEncoding=utf8&useSSL=false

donde /test era el nombre de la base de datos.

En la cadena de conexión de mi ejemplo, que creo que es el que utilizas, es:

B4X:
JdbcUrl=jdbc:mysql://localhost:3306?characterEncoding=utf8&useSSL=false

Es decir, no se especifica ninguna base de datos, eso lo hacemos en el config.properties. Si te fijas, se especifican como:
B4X:
sql.getEvents = SELECT * FROM B4X.events WHERE `month` = ? AND `id_user` = ?

donde B4X es la base de datos a la que te conectas. Simplemente cambia ahí el nombre de la base de datos y ya está.

Se dio cuenta alguien de ese detalle, en este hilo, y como indica Don Manfred, las bases de datos deben tener un usuario con los mismo derechos.

saludos,

En sql server sé que se puede poner por delante la base de datos. Pero en otras bases de datos no lo sabía.

La única cosa sería tener tantas combinaciones de sql.GetEvents como bases de datos fueras a utilizar. (siempre que la estructura de tablas se repita en las bd)
 

Sergio Castellari

Active Member
Licensed User
@José J. Aguilar
Tu propuesta es muy interesante pero tiene una "traba" según mis necesidades:
A) Básicamente mi APP, va requerir mas de 400 comandos SQL, así que imagínate si por cada uno de mis clientes debo REPETIRLOS según la DB. Es por ello (salvo que este entiendo mal tu propuesta) que el método debía ser diferente, donde la DB se la indico directamente en el Request del cliente.
B) Las estructuras de todas las DB son IGUALES, pero cada cliente tiene acceso a la suya, predeterminada con anterioridad.
C) Todas las DB están en el mismo Servidor
D) Solo quiero mantener/actualizar un archivo "config.properties" por el motivo del punto A.

@Gabino A. de la Gala
MySQL acepta el nombre de la DB en el formato dbname.tablename, y también el formato donde le indicas la dbname al principio de la conexión.

SOLUCIÓN!!!
EL señor @aeric, logró comprender mi necesidad y me dio algunas respuestas (que con algunos pequeños cambios) logré que funcionara como lo necesitaba.

Del lado Servidor:
Utilizo el siguiente jRDC2 Multi (creado por Erel) https://www.b4x.com/android/forum/threads/mysql-connector-for-b4i.116617/#post-729095
Donde esta la Lista de DB, lo sustituyo por el conjunto de DB de mis clientes y NINGÚN cambio más!

Del lado Cliente:
Se modifica:
CreateRequest:
Sub CreateRequest As DBRequestManager
  'Por cada solicitud, se crea un nuevo DBRequest...
  Dim Req As DBRequestManager
  Req.Initialize(Me, rdcLink & "?DBName=" & Main.pDBName )   'Aqui va la DBName a utilizar!!!
  Return Req
End Sub

Main:
Sub Process_Globals
    'Variables PUBLICAS del Sistema/Cliente [Se DEBEN cambiar según mi cliente]
    Public pEmpresa = "SDC Soluciones Informáticas" As String
    Public pDBName = "dbnombre"                        As String

DbRequestManager:
Private Sub SendJob(j As HttpJob, Data() As Byte, Tag As Object, Method As String) As HttpJob
    j.Tag = Tag
    If link.Contains("?") Then link = link & "&" Else link = link & "?"
    j.PostBytes(link & "method=" & Method , Data)
    Return j
End Sub

De esta forma, le envío la DB en el Request. La GRAN ventaja, es que luego no se debe cambiar mas nada en el código. Todo los requerimientos actuales quedan igual.
Por supuesto que se puede "camuflar" mucho mejor el nombre de la DB, pero el concepto es el que me sirve para cada APP.

Como verán los cambios son MÍNIMOS, y logramos tener un Servidor jRDC2 multi Bases de Datos y un único "config.properties"

Agradezco infinitamente sus ayudas y orientaciones!!!
Les deseo un hermoso fin de semana!
Sergio
 

josejad

Expert
Licensed User
Longtime User
Otra solución para no tener tantas bases de datos duplicadas es que tengas una sola común a todos los clientes, y un campo "cliente", para distinguir cada registro, y filtrar en los comandos sql por cliente.
 

Situ LLC

Active Member
Licensed User
Bueno les comento ,
como dijo enrique ,
yo utilizo 3 bases de datos en mismo .jar es multiconeccion y me va de maravillas rapido simple y sencillo.
Ahh.. hasta el momento va muy bien , deberian probar las modificaciones de Enrique.
 
Top