Foros del Web » Programación para mayores de 30 ;) » Java »

Relacionar consulta select con threads

Estas en el tema de Relacionar consulta select con threads en el foro de Java en Foros del Web. Hola, estoy aprendiendo Java y me han propuesto hacer un ejercicio que "simplemente" tome el resultSet de una consulta a MySQL y dependiendo del número ...
  #1 (permalink)  
Antiguo 17/01/2009, 07:04
Avatar de Batusai  
Fecha de Ingreso: enero-2005
Ubicación: Málaga -Andalucía- España
Mensajes: 130
Antigüedad: 19 años, 3 meses
Puntos: 1
Pregunta Relacionar consulta select con threads

Hola,

estoy aprendiendo Java y me han propuesto hacer un ejercicio que "simplemente" tome el resultSet de una consulta a MySQL y dependiendo del número de coincidencias (por ejemplo, que me devuelva 27 valores) se aplique un hilo a cada uno de esos valores.
En cada uno de esos hilos debo ejecutar una script en Linux.

Cualquier guía, orientación, o referencia a soluciones a cualquiera de los "subproblemas" que he planteado sería muy agradecida.

Saludos.
  #2 (permalink)  
Antiguo 17/01/2009, 09:14
 
Fecha de Ingreso: octubre-2003
Mensajes: 3.578
Antigüedad: 20 años, 6 meses
Puntos: 51
Respuesta: Relacionar consulta select con threads

No crees directamente un Thread por cada valor, o puedes encontrarte con que el query te devuelva 200 resultados y acabes con 200 threads simultaneos que no tienen por que dar mejor rendimiento a no ser que tengas 200 cores o los procesos tengan que esperar por E/S. Lo mejor es limitar el numero de Threads, jugando con varias configuraciones hasta encontrar la correcta para el host y las tareas que estemos usando.

S!
__________________
Para obtener respuestas, pregunta de forma inteligente o si no, pregunta lo que quieras que yo contestaré lo que me dé la gana.
  #3 (permalink)  
Antiguo 17/01/2009, 11:33
Avatar de Batusai  
Fecha de Ingreso: enero-2005
Ubicación: Málaga -Andalucía- España
Mensajes: 130
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: Relacionar consulta select con threads

Gracias por el aviso. No había pensado en esa posibilidad. De momento el resultado sería corto, aunque quizá en el futuro el número de referencias aumentara, así que me podría encontrar con un problema.

Pero yendo al tema, ¿sabría alguien decirme alguna web donde pueda encontrar un código que haga algo similar? He mirado en la sección Java-BBDD de HotScripts y son todo aplicaciones ya hechas complejas y ninguna me va bien.

¿Alguien me ilumina?
  #4 (permalink)  
Antiguo 27/01/2009, 10:48
Avatar de Batusai  
Fecha de Ingreso: enero-2005
Ubicación: Málaga -Andalucía- España
Mensajes: 130
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: Relacionar consulta select con threads

Hola de nuevo,

el caso es que sé hacer la consulta MySQL (he probado que funciona) y he encontrado código para hacer los pings pero no sé cómo hacer interactuar ambos códigos. Es debido a mi aún corto conocimiento de Java. Os lo expongo:

LaBaseDatos.java
Código:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.*;

public class LaBaseDatos {

	//Atributos
	private Connection con;
	private Statement st;
	private String consulta = "SELECT ip FROM equipos WHERE monitorizar='1'";
	private String contar = "SELECT COUNT(ip) FROM equipos WHERE monitorizar='1'";
	
	//Constructor
	public laBaseDatos(){
		// Cargar el controlador
		try{
			Class contr = Class.forName("com.mysql.jdbc.Driver");
			System.out.println(contr.toString());
			
		}catch (ClassNotFoundException cnfe){
			System.out.println("com.mysql.jdbc.Driver");
		}
		//Conectar con la BD
		try{
			//String direccion. Hace referencia a una URL, un recurso de la aplicacion
			Connection micon = DriverManager.getConnection("jdbc:mysql://localhost/Comercio","root","");
			
			//Crear objeto Statement
			Statement st = micon.createStatement();
			this.con = micon;
			this.st = st;
			
		}catch(SQLException sqle){
			System.out.println("Error al establecer la conexion");
		}
	}
	
	//Métodos
	// Ejecuta una consulta de seleccion, devolviendo el objeto "ResultSet"
	//con los datos obtenidos en la consulta
	public ResultSet selecciona (String consulta) throws SQLException{
		
		return this.st.executeQuery(consulta);
		
	}

	public ResultSet elSize (String contar) throws SQLException{
		
		return this.st.executeQuery(contar);
		
	}
	//Obtener el ResultSet
	public ResultSet getResultSet() throws SQLException{
		return this.st.getResultSet();
	}
	//Obtener el conector
	public Connection getCon(){
		return this.con;
	}

}
ElComando.java
Código:
import java.io.*;

public class elComando {
  public static void main(String[] args)
  {
    try
    {
    	String[] command = {"sh","-c","/api/utils/check_fping <<ip>>"};
    	// Se debería cambiar <<ip>> por cada una de las IP's del resulSet
    	final Process process = Runtime.getRuntime().exec(command);
    	new Thread()
    	{
    		public void run()
    		{
    			try{
    				InputStream is = process.getInputStream();
    				byte[] buffer = new byte[1024];
    				for(int count = 0; (count = is.read(buffer)) >= 0;)
    				{
    					System.out.write(buffer, 0, count);
    				}
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}.start();
    	new Thread()
    	{
    		public void run()
    		{
    			try{
    				InputStream is = process.getErrorStream();
    				byte[] buffer = new byte[1024];
    				for(int count = 0; (count = is.read(buffer)) >= 0;)
    				{
    					System.err.write(buffer, 0, count);
    				}
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}.start();
    	
    	int returnCode = process.waitFor();
    	System.out.println("Return code = " + returnCode);
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
  }
}
¿Debo crear una nueva clase para hacerlos interactuar o puedo hacerlo directamente en el Main?

Cualquier ayuda sería muy agradecida. Saludos.
  #5 (permalink)  
Antiguo 29/01/2009, 11:45
Avatar de Batusai  
Fecha de Ingreso: enero-2005
Ubicación: Málaga -Andalucía- España
Mensajes: 130
Antigüedad: 19 años, 3 meses
Puntos: 1
Respuesta: Relacionar consulta select con threads

Clase: BBDD.java

Código:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class BBDD {

	//Atributos
	private Connection con;
	private Statement st;
	private String consulta = "SELECT ip FROM equipos WHERE monitorizar='1'";
	private String contar = "SELECT COUNT(ip) FROM equipos WHERE monitorizar='1'";
	private ResultSet rs;
	
	//Constructor
	public BBDD(){
		// Cargar el controlador
		try{
			Class contr = Class.forName("com.mysql.jdbc.Driver");
			System.out.println(contr.toString());
			
		}catch (ClassNotFoundException cnfe){
			System.out.println("com.mysql.jdbc.Driver");
		}
		//Conectar con la BD
		try{
			//String direccion. Hace referencia a una URL, un recurso de la aplicacion
			Connection micon = DriverManager.getConnection("jdbc:mysql://localhost/Comercio","root","");
			
			//Crear objeto Statement
			this.con = micon;
			Statement st = micon.createStatement();
			this.st = st;
			ResultSet rs = st.executeQuery (consulta);
			// Recorremos el resultado, mientras haya registros para leer, y escribimos el resultado en pantalla. 
			while (rs.next()) 
			{ 
			    System.out.println (rs.getInt (1) + " " + rs.getString (2)+ " " + rs.getDate(3)); 
			}
		}catch(SQLException sqle){
			System.out.println("Error al establecer la conexion");
		}
	}
	
	//Métodos
	// Ejecuta una consulta de seleccion, devolviendo el objeto "ResultSet"
	//con los datos obtenidos en la consulta
	public ResultSet selecciona (String consulta) throws SQLException{
		
		return this.st.executeQuery(consulta);
		
	}

	public ResultSet elSize (String contar) throws SQLException{
		
		return this.st.executeQuery(contar);
		
	}
	//Obtener el ResultSet
	public ResultSet getResultSet() throws SQLException{
		return this.st.getResultSet();
	}
	//Obtener el conector
	public Connection getCon(){
		return this.con;
	}

	public Connection getIP(){
		// NI IDEA DE QUÉ PONER AQUÍ
	}

}
y también una clase llamada Ping.java

Código:
import java.io.InputStream;

public class Ping {
  public static void main(String[] args)
  {
    try
    {
    	String ip = BBDD.getIP();
    	String cadena = "/api/utils/check_fping " + ip;
    	String[] command = {"sh","-c",cadena};
    	// Se debería cambiar <<ip>> por cada una de las IP's que salgan del resulSet
 
    	final Process process = Runtime.getRuntime().exec(command);
    	new Thread()
    	{
    		public void run()
    		{
    			try{
    				InputStream is = process.getInputStream();
    				byte[] buffer = new byte[1024];
    				for(int count = 0; (count = is.read(buffer)) >= 0;)
    				{
    					System.out.write(buffer, 0, count);
    				}
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}.start();
    	new Thread()
    	{
    		public void run()
    		{
    			try{
    				InputStream is = process.getErrorStream();
    				byte[] buffer = new byte[1024];
    				for(int count = 0; (count = is.read(buffer)) >= 0;)
    				{
    					System.err.write(buffer, 0, count);
    				}
    			}
    			catch(Exception e)
    			{
    				e.printStackTrace();
    			}
    		}
    	}.start();
    	
    	int returnCode = process.waitFor();
    	System.out.println("Return code = " + returnCode);
    }
    catch (Exception e)
    {
    	e.printStackTrace();
    }
  }
}
Cualquier pista de por qué me falla la aplicación y cómo solucionarlo sería muy agradecida.

Saludos y gracias de antemano.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:14.