Cómo conectar dos maquinas a una base de datos
Hola a todos, el problema q tengo es el siguiente: Tengo un aplicacion hecha en netbeans que usa una base de datos Mysql, y para ellos instale el Appserver, y todo me funciona perfecto en la pc que tengo el sistem y la base de datos, ahora me ha surgido una ampliación y necesito que otra pc con la misma aplicación se conecte a la base de datos, cómo podría realizar esto, muchas gracias estaré esperando sus respuestas.
- Inicie sesión o regístrese para enviar comentarios
?
MySQL es multiusuario, simplemente apunta tu segunda aplicación a la misma instancia de MySQL y ya.
Tal vez tu verdadera duda no es cómo conectar dos aplicaciones distintas a la misma base de datos, sino cómo vas a lidiar con las broncas de concurrencia cuando ambas aplicaciones quieren modificar los mismos datos. O tal vez amanecí muy optimista y la duda es realmente cómo hacer que dos apps se conecten al mismo mysql...
Efectivamente mi duda es
Efectivamente mi duda es como conectar dos aplicaciones distintas a la misma base de datos, me podria colocar un ejemplo
que tal nunca e usando
que tal nunca e usando appserver pro yo andaba hace unos dias con algo parecido en ubuntu server.. si loq kieres es hacer la conexion en otra maquina tu usuario de mysql debera tener permisos de conexion remota algo asi deberia aparecer
usuario@%
me imagino que como esta en local todo no ay problema conectarte desde otra maquina tendrias que darle permiso de conexion a windows esto es debloquear el firewall q tengas antivirus,etc para que acepte esa conexion esto seria si esta default todo myslq se conecta por el puerto 3306
haciendo eso no creoq tengas problemas en tu red interna..
ahora si loq kieres es conectarte desde internet ps deberias abrir ese mismo puerto en tu router para q acepte una conexion entrante y creoq con eso kedaria..
pruebalo si no ps vuelve a preguntar aqui andamos salu2
Pregunta: ¡¿Como le hace
Pregunta: ¡¿Como le hace tu primera aplicación para conectarse a la base de datos en primer lugar?!
Lo más probable es que tengas en algun lugar una configuración donde le dices que servidor, puerto, usuario y password usas. ¿Correcto?
En caso de ser así, lo único que tienes que hacer es poner esa misma configuración en tu otra máquina y listo.
Si no es así, lo primero que tienes que buscar es donde se pone esta configuración.
2. if( configuracion == encontrada ) {
3. aplicarASegundaPc( configuracion )
4. } else {
5. goto 1
6. }
Suerte.
Gracias por sus respuestas,
Gracias por sus respuestas, hestuve probando la respuesta de "genitalico", otorgandole permiso en el firewall de w7 y modifique la aplicación el código que se conecta a la base de datos
public String bd = "planilla";
public String login = "root";
public String password = "lu199803";
public String url = "jdbc:mysql://192.168.1.33:3306/"+bd;
estableci a la pc donde se encuentra la base de datos un ip estatica ya siempre apogo el router; la ip es la que se muestra y le puse el puerto "192.168.1.33:3306" espero se encuentre bien y he probado la aplicacion que vendria a ser el cliente q se encuentra en otra maquina y no se conecta; y eso de desbloquer el firewall del antivirus no se como hacer el antivirus que uso es smart security 4; y de la última respuesta me gustaria que me explique el código y gracias por sus respuestas y estaré esperando las que siguen.
¬¬
Primero responde: ¿Como le hace tu aplicación para conectarse actualmente?
Haz de cuenta que no sabemos absolutamente nada de tu aplicación, que no podemos ver el código, e imaginate que no sabemos que es lo que estas usando y que nos tienes que explicar como conectarnos ¿Que dirías? ¿Como nos explicarías la forma en la que te estas conectando?
Algo como "Estoy abriendo una conexion con JDBC usando DriverManager y luego etc. etc. y aqui está el código" O bien. "Estoy usando la clase "Conectarme" que hizo un amigo y que hace Xyz, etc."
¿Puedes poner un ejemplo básico de como te conectas? ( Quizá poner el código relevante en tu aplicación que establece la conexión )
Cuando puedas darnos esa información, te aseguro que estarás mucho más cerca de conectar la segunda PC que ahora.
Hasta entonces.
Gracias por la sugerencia y
Gracias por la sugerencia y aqui esta la clase que he creado la cual es conexion y si JDBC usando Driver Manager para mysql; y cada vez q necesito registrar o guardar hago la llamada a esta clase ,le agradesco por su tiempo:
public String bd = "planilla";
public String login = "root";
public String password = "lu199803";
public String url = "jdbc:mysql://192.168.1.33:3306/"+bd;
Connection conn=null;
Statement st=null;
ResultSet r=null;
public void registrar(String tabla, String datos) {
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
System.out.println("Conexión a base de datos "+url+" ... Ok");
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
st.executeUpdate("INSERT INTO "+ tabla +" VALUES" + "("+datos+")");
conn.close();
st.close();
JOptionPane.showMessageDialog(null, "Los datos han sido guardados");
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
JOptionPane.showMessageDialog(null, "Los datos no han sido guardados");
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
}
public String Generarcodigo(String tabla) {
int resultado=0;
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
System.out.println("Conexión a base de datos "+url+" ... Ok");
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
r=st.executeQuery("SELECT COUNT(*) FROM "+ tabla);
r.next();
resultado=r.getInt(1)+1;
st.close();
conn.close();
r.close();
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
if (resultado<=9 ){
return "0"+resultado;
}else{
return ""+resultado;
}
}
public void Actualizar( String datos){
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
System.out.println("Conexión a base de datos "+url+" ... Ok");
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
st.executeUpdate(datos);
conn.close();
st.close();
JOptionPane.showMessageDialog(null, "Los datos han sido Actualizados");
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
JOptionPane.showMessageDialog(null, "Los datos no han sido Actualizados");
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
}
public void Eliminar(String datos){
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
System.out.println("Conexión a base de datos "+url+" ... Ok");
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
st.executeUpdate(datos);
conn.close();
st.close();
JOptionPane.showMessageDialog(null, "Los datos han sido Eliminados");
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
JOptionPane.showMessageDialog(null, "Los datos no han sido Eliminados");
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
}
public String Buscar(String datos, String id){
String dato="";
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
r=st.executeQuery(datos);
r.next();
dato=r.getString(id);
st.close();
conn.close();
r.close();
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
return dato;
}
public Integer BuscarEntero(String datos, String id){
int dato=0;
try {
Class.forName("org.gjt.mm.mysql.Driver");
conn = DriverManager.getConnection(url, login, password);
if (conn != null){
st= conn.createStatement(r.TYPE_SCROLL_SENSITIVE,r.CONCUR_UPDATABLE);
r=st.executeQuery(datos);
r.next();
dato=r.getInt(id);
st.close();
conn.close();
r.close();
}
}catch(SQLException ex) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
}catch(ClassNotFoundException ex) {
System.out.println(ex);
}
return dato;
}
}
Ok, ya entiendo. Te estas
Ok, ya entiendo.
Te estas conectando usando JDBC, con
DriverManager.getConnection()
. De hecho eso es lo que necesitaba saber, como te estas conectando.Veo que los datos de conecxion ( usr, password, host y port ) los tienes como constantes. Siendo así, ejecutar directamente esta aplicación dentro de tu otra PC debería de funcionar sin problemas. Pero como NO está funcionando, tenemos que entender ( más bien tu, tienes que entender ) que es lo que dificulta la conexion.
En el código de manejo de excepciones tienes:
catch( SQLException ex ) {
System.out.println("Hubo un problema al intentar conectarse con la base de datos "+url);
}
A eso se le llama "ignorar" la excepción Si incluyes la siguiente llamada:
El programa te va a mandar un mensaje muy detallado que lo que pasó y de por que no pudo conectarse.
Agrega esa línea y en pega acá lo que sale ( recuerda incluirlo entre los tags <code> y </code> para que le de formato )
Lo más probable es que ahi venga una explicación ( que quizá no te haga mucho sentido, pero algo dice ) de por que no se puede conectar. Quizá sea que no ve la máquina, que le rechaza o algo.
Ultima pregunta: La aplicación cuando SI se conecta, esta en la misma máquina que la bd?
Pega pues, el stacktrace y seguimos con esto.
Chau!
Efectivamente la aplicacion
Efectivamente la aplicacion se conecta pero cuando se emplea la "url=jdbc:mysql://localhost/"+bd;"
public String bd = "planilla";
public String login = "root";
public String password = "lu199803";
public String url = "jdbc:mysql://192.168.1.33:3306/"+bd;
entonces voy a probar lo que me dices y vendo con el resultado.
Mhh ya veo, entonces solo lo
Mhh ya veo, entonces solo lo hace cuando la aplicacion y la bd corren en la misma máquina.
Lo más probable es que tu otra máquina no pueda ver esa IP. Por cierto no hace falta "concatenar" la base de datos, por que ya la tienes como constante de todas formas:
public String url = "jdbc:mysql://192.168.1.33:3306/"+bd;
Es exactamente lo mismo que:
No?? Pero bueno, de las mejoras podemos hablar después. Por lo pronto hay que ver por que no se conecta.
Esperamos el stacktrace.
RTFS: Las excepciones son tus amigas, usalas!
Y es lo que yo llamaria una muy mala practica de programación.
Muy buen consejo, seria mejor aun si usaras algo com SLF4J, pero con printStackTrace basta.
Mas info sobre la importancia del stacktrace aqui .
@luxspes Pues si, pero
@luxspes Pues si, pero sería mejor empezar con lo extra, extra básico no, crees? Yo pondría lo del SLF4J como un lujo, considerando todas las "areas de oportunidad" que el código tiene ahora mismo ( como
st.executeUpdate("INSERT INTO "+ tabla +" VALUES" + "("+datos+")");
) pero, vamonos por partes. ¡Primero que se conecte!. :) :)se que ya lo dije.. pero ya
se que ya lo dije.. pero ya le diste permisos de conexion remota a tu usuario mysql? y asignaste los permisos de la BD al usuario que se conectara? porq me sucedio hace unos dias algo parecido y estaba en lo mismo por esa razon d permisos no podia conectarme..
y otra cosa q ondas con las bd y java ay muchos hilos en el foro con lo mismo jaja.... no esq estas en mi escuela y nos dejaron la misma tarea puff xD
noc q dice alguien q tenga mas experiencia en esto abrire un post nuevo recopilando lo que e llevado con mis conexiones a mysql y java..y nos echen la mano a todos ahi
salu2
Hola aqui esta el mensaje
Hola aqui esta el mensaje que sale de la excepcion:
run:
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.net.ConnectException
MESSAGE: Connection timed out: connect
STACKTRACE:
java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)
at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366)
at java.net.Socket.connect(Socket.java:529)
at java.net.Socket.connect(Socket.java:478)
at java.net.Socket.(Socket.java:375)
at java.net.Socket.(Socket.java:218)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256)
at com.mysql.jdbc.MysqlIO.(MysqlIO.java:271)
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2771)
at com.mysql.jdbc.Connection.(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at control_plainlla.Cargo_Mantenimiento1.PrepararTabla(Cargo_Mantenimiento1.java:58)
at control_plainlla.Cargo_Mantenimiento1.(Cargo_Mantenimiento1.java:41)
at control_plainlla.Menu$50.run(Menu.java:1535)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
** END NESTED EXCEPTION **
Last packet sent to the server was 1 ms ago.
at com.mysql.jdbc.Connection.createNewIO(Connection.java:2847)
at com.mysql.jdbc.Connection.(Connection.java:1555)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:285)
at java.sql.DriverManager.getConnection(DriverManager.java:582)
at java.sql.DriverManager.getConnection(DriverManager.java:185)
at control_plainlla.Cargo_Mantenimiento1.PrepararTabla(Cargo_Mantenimiento1.java:58)
at control_plainlla.Cargo_Mantenimiento1.(Cargo_Mantenimiento1.java:41)
at control_plainlla.Menu$50.run(Menu.java:1535)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Hubo un problema al intentar conectarse con la base de datos jdbc:mysql://192.168.1.33:3306/planilla
listener
En PostgreSQL es común este problema cuando recién se instala una base de datos porque por default solamente recibe conexiones locales, hay que modificar la configuración para que acepte conexiones de fuera. Tal vez MySQL es similar, solamente acepta conexiones locales por default y hay que modificar su config para que acepte conexiones de fuera (que puede ser consecuencia de que el server escucha sólo en la interfaz de red lo0 y se le cambia a que escuche en todas las disponibles).
Acá hay un link de donde
Acá hay un link de donde podrias revisar en MySQL para que acepte conexiones desde fuera:
http://forge.mysql.com/wiki/Error2003-CantConnectToMySQLServer#MySQL_Ser...
Dedicale un tiempo y podrás ver como configurar tu base de datos que actualmente NO esta aceptando conexiones remotas ( ni de Java ni de ningun otro )
Puede ser la configuración por default ( como dice EZamudio ) o el Firewall ( como dice Genitalico ) en ambos casos, lo que es seguro, y gracias al stacktrace, es que la máquina remota no está aceptando la conexion. Es decir, no es de Java la cosa, sino de MySQL/Windows.
Cuando termines dale una leida al link de luxspes sobre las excepciones.
Buen fin.
yo tengo un problemas similar
bueno yo tengo un problema similar tengo una aplicacion realizada en visual basic 2010 que interactua con sql server express 2005 mi forma de conexion es la siguiente :
Protected Function conectado()
Try
cnn = New SqlConnection("data source=(local);initial catalog=inventario; integrated security=true")
cnn.Open()
Return True
Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try
End Function
Protected Function desconectado()
Try
If cnn.State = ConnectionState.Open Then
cnn.Close()
Return True
Else
Return False
End If
Catch ex As Exception
MsgBox(ex.Message)
Return False
End Try
End Function
funciona correctamente localmente el problema es que la aplicacion funcione en tres computadoras al mismo tiempo conectadose a la base de datos que esta en mi computadora como puedo resolver esto alguien me podria ayudar mil gracias
Conectate por alias no por IP
En lugar de hacer conexion a 123.123.123.123 mejor asignale un alias a la tabla de host de tu sistema operativo. supone que asignas:
de esa forma solo tendras que agregar esa linea en el host de las computadoras que uses (si no es que metes un DNS para que uses el FQDN). De esa forma una cadena de conexion (tomando la que vi que por ahi meten) quedaria:
Para el VB (pffft) se puede aplicar la misma solucion
hola que tal
ojala alguien me pueda ayudar con un problema que tengo con un programa..
en mi computadora tengo un pequeño sistema de consultas, la base de datos esta montada en el PhpMyAdmin (sql) del Xampp. la interfaz grafica la tengo en java, pero ahora lo que quiero hacer es ese mismo tipo de consultas (solo lectura) pero desde otro ordenador (en red local), he leido muchos articulos en internet y aun no logro captar la idea de como hacerlo... no estoy seguro si necesito el Mysql server, y como configurarlo,
la conexion local con la base la hago asi:
public class ConexionDataBase{
public String db = "nombre-de-la-base";
public String url = "jdbc:mysql://localhost/"+db;
public String users = "root";
public String pass = "";
public ConexionDataBase (){
}
espero algun tipo de ayuda
Gracias...
NOTA: en una de las maquinas solo quiero hacer consultas de tipo solo lectura.
me han dicho que solo cambie este fragmento de codigo:
url="jdbc:mysql://localhost/"+db;
por este:
url="jdbc:mysql://192.168.23.11/"+db; donde: 192.168.23.11 es la ip de la otra maquina... pero no he tenido exito...
desactive el firewall de win en ambas maquinas pero ahora me sale este error:
java.sql.SQLException:null, message from server:"Host 'BLACK-ICE-PC.lan' is not allowed to connect to this
MySQL server"
ojala alguien me pueda ayudar.. gracias
trabajar la concurrencia
ezamudio que tal, se que el post es algo viejo, pero se me esta presentando este problema de la concurencia, tengo una aplicacion desktop que realice en eclipse hace un tiempo, mi aplicacion posee una clase conexion, que carga el driver y hace la conexion, de igual forma define los metodos para consultas y update., necesito distrubuir el jar en otras 3 maquinas, tecnicamente cada maquina al llamar la clase conexion abriria una conexion nueva, cuando realizo una consulta para actualizar o eliminar, cargo los datos que necesito, y cierro la conexion, cuando realice la actualizacion o la eliminacion vuelvo abrir la conexion y luego del proceso la cierro, es decir.. no es una conexion dedicada, la abro y la cierro segun lo que requiera la operacion... como puedo controlar la concurrencia en mi actual situacion? que debo modificar mi clase conexion , lo que no deseo es modificar cada una de las clases desarrolladas :
Cuando deseo hacer una consulta este es el codigo:
ResultSet rs=conn.dbSelect("Select * from loquesea .....")
if (rs.first){
codigo//
}
conn.CerrarConexion();
<code/>
Para una insercion o delete este es mi metodo
<code>
conn=new CS_Conexion(1,"nameDb"); // creo un objeto conexion que abre y crea el statment
conn.dbOperaciones("Update......)
conn.dbOperaciones("Insert......)
conn.CerrarConexion();//cierro mi conexion
<code/>
Para manejar la concurrencia como debiera optimizar mi codigo para manejar la concurrencia, gracias???
<code>
import java.io.FileWriter;
import java.io.PrintWriter;
import java.sql.*;
import csytec.clases.CS_SocketInf;
import csytec.sistema.IgPantallaInicial;
public class CS_Conexion {
public String driver,url,ip,bd,usr,pass;
public Connection conexion;
private Statement stm;
private static CS_SocketInf inf=new CS_SocketInf();
public CS_Conexion (int status,String db){
//ip="xxxxxx";
ip="xxxxxxxx:3306";
//ip="localhost";
bd=db;
usr="xxxx";
pass="xxxx";
url = new String("jdbc:mysql://"+ip+"/"+bd);
driver="com.mysql.jdbc.Driver";
if (status==1){
try{
Class.forName(driver).newInstance();
conexion=DriverManager.getConnection(url,usr,pass);
stm=conexion.createStatement();
}catch (Exception exc){
System.out.println("Error al tratar de abrir la base de Datos" +" "+bd+ " : "+exc);
}
}
}
public Connection getConexion(){
return conexion;
}
private Statement getStatement(){
return this.stm;
}
public ResultSet dbSelect(String sentencia){//Operaciones de Consulta
ResultSet rs = null;
try {
rs = this.getStatement().executeQuery(sentencia);
logInf(inf.getfecha(),inf.gettimer(),sentencia);
} catch (SQLException ex) {
System.out.println(ex);
}
return rs;
}
public boolean dbOperaciones(String sentencia){ //Operaciones para Update & Delete
boolean rs = false;
try {
rs = this.getStatement().execute(sentencia);
logInf(inf.getfecha(),inf.gettimer(),sentencia);
} catch (SQLException ex) {
System.out.println(ex);
}
return rs;
}
public int numFilas(String sentencia){
ResultSet rs = null;
int numero = 0;
try {
rs = this.getStatement().executeQuery(sentencia);
while(rs.next()){
numero++;
}
rs.close();
} catch (SQLException ex) {
System.out.println(ex);
}
return numero;
}
public Connection CerrarConexion() throws SQLException{
conexion.close();
conexion = null;
return conexion;
}
void logInf(String a,String b,String c){ //Auditoria de procesos
String fec=inf.getfecha().toString().replace("/", "-");
String ruta=("C:/xxx/xxx/xxxxx/"+fec+"-"+"logInfo.txt");
String user=IgPantallaInicial.getUsuario();
FileWriter fichero = null;
PrintWriter pw = null;
try
{
fichero = new FileWriter(ruta,true);
pw = new PrintWriter(fichero);
pw.println(a+" - "+b+" - "+user+" [QUERY]=>"+c);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (null != fichero)
fichero.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
}
}
<code/>
bloqueos
Lee acerca de estrategias de bloqueo optimistas y pesimistas.