Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > De jtable a Mysql duda de insertar datos

Hola saludos a todos.

Estoy insertando datos en una tabla de mysql este el codigo que utilizo:
if(TablaHoras.getRowCount() == 0){
JOptionPane.showMessageDialog(this, "Agrege un Archivo para Guardar!!!");

}else{

DefaultTableModel modelo = (DefaultTableModel) TablaHoras.getModel();
int Filas = modelo.getRowCount();

for(int i = 0; i<Filas; i++){

try {
String id = TablaHoras.getValueAt(i, 0).toString();
String fecha = TablaHoras.getValueAt(i, 1).toString();
String hora = TablaHoras.getValueAt(i, 2).toString();
con.getConnection();
Statement st;
st = con.getConnection().createStatement();
int rs;
String sql;
sql="insert into marcas(id, fecha, hora) values('"+id+"', '"+fecha+"','"+hora+"')";
rs = st.executeUpdate(sql);

} catch (SQLException ex) {
JOptionPane.showMessageDialog(this, ex.getMessage());
}
}
JOptionPane.showMessageDialog(this, "marcas Ingresadas Exitosamente");
}

Cuando hago el insert de las filas del jtable que son alrededor de 3000 se demora aprox 1 minuto con 30 segundos, ahora mi duda es la siguiente hay alguna forma de insertar las filas en menos tiempo??, he buscado en foros, blogs no he encontrado nada, de esa forma aprendi a insertar espero que me puedan ayudar con otra forma, se los agradecira mucho.

Bendiciones.

diciembre 27, 2014 | Unregistered CommenterDiego

Esta llamada está duplicada: con.getConnection();
No es necesario, en este caso, que la llamada esté dentro del bucle.
Sería necesario saber el contenido del método getConnection(); porque si usa siempre el DriverManager en su código para obtener la conexión, hay un problema de rendimiento evidente.

diciembre 28, 2014 | Registered Commenterchoces

No es que yo use JDBC, pero diría que otra cosa que puedes mejorar es crear un PreparedStatement fuera del bucle y reutilizarlo para cada inserción cambiando los parámetros.

Luego hay otra cosa que tienes que considerar si el proceso sigue siendo lento: ese código seguramente lo estás ejecutando como parte de un manejador de eventos (ActionPerformed) y, por tanto, se está ejecutando en el EDT de Swing. Si es así, ese tiempo de ejecución mantendrá bloqueado Swing y, en consecuencia, la interfaz de usuario no responderá a los clics de ratón, por ejemplo. Y, si no es así, no deberías invocar entonces los JOptionPane. En ambos casos, al final deberías sacar ese código a una tarea gestionada con SwingWorker.

diciembre 28, 2014 | Registered Commenterrickiees

hola acá esta la clase que uso para conectarme, de seguro que estoy usando mal la clase, por eso se demora, intentare las cosas que uds me han dicho, gracias.

public class Conexion {
public String bd = "base_de_dedatos";
public String login = "usuario";
public String password = "xxxxxx";
public String url = "jdbc:mysql://localhost/"+bd;

Connection conn = null;

public Conexion() {
try{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection(url,login,password);
if (conn!=null){
//JOptionPane.showMessageDialog(null,"Conexión a base de datos. Listo");
}
}catch(SQLException | ClassNotFoundException e){
JOptionPane.showMessageDialog(null, e.getMessage());
}
}

public Connection getConnection(){
return conn;
}

public void desconectar(){
conn = null;
}
}

diciembre 29, 2014 | Unregistered CommenterDiego

La clase de conexión la haría así:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public enum Conexion {

INSTANCE;

private static final String bd = "base_de_dedatos";
private static final String login = "usuario";
private static final String password = "xxxxxx";
private static final String url = "jdbc:mysql://localhost/" + bd;
private static volatile Connection connection;

static {
try {
connection = DriverManager.getConnection(url, login, password);
} catch (SQLException ex) {
// log o mensaje de consola
}
}

public static Connection getConnection() throws SQLException {
if (connection == null || connection.isClosed()) {
throw new SQLException("La conexión está cerrada");
}
return connection;
}

public static void desconectar() throws SQLException {
if (connection != null){
connection.close();
{
}

}

Usarla es muy sencillo:

Connection con = Conexion.getConnection();
Conexion.desconectar();

Aparte de lo ya comentado, podrías usar el modo batch de JDBC.

http://www.tutorialspoint.com/jdbc/jdbc-batch-processing.htm
http://viralpatel.net/blogs/batch-insert-in-java-jdbc/
https://my.vertica.com/docs/4.1/HTML/Master/14878.htm
http://stackoverflow.com/questions/3784197/efficient-way-to-do-batch-inserts-with-jdbc

diciembre 29, 2014 | Registered Commenterchoces

hola muchas gracias por el dato del método batch(); los tiempos bajaron increíblemente, son unos maestros.

diciembre 30, 2014 | Unregistered CommenterDiego

Guenas.

@Choces:
No lo he entendido.

¿No faltaria en el static de la clase la carga del driver?

Tampoco entiendo que se use una única conexion ya que al ser static una vez cerrada la conexion ya no puede usarse mas la clase segun getConection().

Seguro que lo estoy mirando mal. Compréndelo, estos días de fiesta estoy con el estomago mas activado que el cerebro y saturado de alcohol :)

Un saludo

diciembre 31, 2014 | Unregistered CommenterPaposo

Desde JavaSE 1.6 no es necesario declarar el driver de manera específica.

Está pensado para una aplicación de escritorio, que abre una conexión permanente y que se puede, y se debe, cerrar cuando la aplicación se cierra.
No tiene mucho sentido abrir y cerrar conexiones en una aplicación de escritorio, con una base de datos local o embebida.
Por supuesto que se puede modificar para que una vez cerrada, se pueda volver a abrir.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public enum Conexion {

INSTANCE;

private static final String bd = "base_de_dedatos";
private static final String login = "usuario";
private static final String password = "xxxxxx";
private static final String url = "jdbc:mysql://localhost/" + bd;
private static volatile Connection connection;

static {
setConn();
}

public static Connection getConnection() throws SQLException {
if (connection == null || connection.isClosed()) {
setConn();
}
return connection;
}

public static void desconectar() throws SQLException {
if (connection != null) {
connection.close();
}

}

private static void setConn() {
try {
connection = DriverManager.getConnection(url, login, password);
} catch (SQLException ex) {
// log o mensaje de consola
}
}
}

diciembre 31, 2014 | Registered Commenterchoces

hermano tengo una duda, yo hice algo similar, pero me dda un problema, dejame explicarte, la ultima comulna de mi jtable es un campo donde capturar los datos, pero el problema es que los inserta todos menos el ultimo, agradeceria cualquier ayuda

julio 7, 2016 | Unregistered Commentersarabanda