[SOLUCIONADO] No funciona funcion commit usando Java

Iniciado por rommel360, Abril 29, 2019, 02:52:51 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 29, 2019, 02:52:51 AM Ultima modificación: Mayo 04, 2019, 12:28:25 AM por Gabriela
El problema es que tengo una aplicacion en Java que lee registros de una BD en SQL SERVER 2008 R2 y esos datos las envia a una BD en MySQL. El programa si hace lo que tiene que hacer. Pero quiero usar la funcion commit por si hubo algun problema a la hora de hacer las movidad de los datos de una base a otra se deshaga todo el cambio (rollback).

Leyendo vi que mis tablas que estan en MySQL deben tener el motor de  InnoDB en vez de MyISAM que es el motor por default. Y tiene que ser InnoDB porque este si soporta la funcion commit , setAutoCommit (para ponerla en falso y a si no haga commit automaticamente) y la funcion rollback (para deshacer cualquier cambio por si salio algo mal en el commit). Pos mi problema es este que los datos no se guardan en las tablas de MySQL .

Clase conexion

Código: java


public void crearConexionSQL() throws ClassNotFoundException
{
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
conexion = DriverManager.getConnection("jdbc:sqlserver://" + servidor + ":" + puerto + ";databaseName=" +  nombre_base_datos + ";user=" + usuario + ";password=" + clave + "");

conexion.setAutoCommit(false);//Se desactiva el auto commit
}
catch (SQLException ex)
{
JOptionPane.showMessageDialog( null, "EN CONEXION crearConexionSQL SQLException \n\n" + ex.getMessage(), "ERROR DE SISTEMA 40", JOptionPane.ERROR_MESSAGE );
}
}

public void crearConexionMySQL() throws ClassNotFoundException
{
try
{
Class.forName("com.mysql.jdbc.Driver");
conexion = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/referencia_contrareferencia", "root" , "" );

conexion.setAutoCommit(false);//Se desactiva el auto commit
}
catch (SQLException ex)
{
JOptionPane.showMessageDialog( null, "EN CONEXION crearConexionMySQL SQLException \n\n" + ex.getMessage(), "ERROR DE SISTEMA 56", JOptionPane.ERROR_MESSAGE );
}
catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog( null, "EN CONEXION crearConexionMySQL ClassNotFoundException \n\n" + e.getMessage(), "ERROR DE SISTEMA 60", JOptionPane.ERROR_MESSAGE );
}
}

public void aceptarSentencias()
{
try
{
conexion.commit();
consultaExitosa( true );
}
catch (SQLException e)
{
desHacerSentencia();
JOptionPane.showMessageDialog(null, "EN CONEXION aceptarSetencias SQLException \n\n" + e.getMessage(), "ERRORDE SISTEMA 128", JOptionPane.ERROR_MESSAGE );
}
}

public void desHacerSentencia()
{
try
{
conexion.rollback();
consultaExitosa( false );
System.out.println("dadadasd");
}
catch (SQLException e)
{
JOptionPane.showMessageDialog(null, "EN CONEXION desHacerSentencia SQLException \n\n" + e.getMessage(), "ERRORDE SISTEMA 140", JOptionPane.ERROR_MESSAGE );
}
}



clase consulta

Código: java

public Vector<Object[]> obtenerSomatometria() throws SQLException
{
Vector<Object[]> datos= new Vector<Object[]>();

datos.clear();

ResultSet valores;

try
{
conexion.crearConexionSQL();
//conexion.getConexion().setAutoCommit(false);

conexion.setSetenciaPreparada(
conexion.getConexion().prepareStatement(
"SELECT IDPaciente, IDDiccionario, cCve_Respuesta, cValor " +
"FROM somatometria" ) );

valores = conexion.ejecutarConsultaObtener();

while( valores.next() )
{
datos.addElement(
new Object[]
{
valores.getString( 1 ),valores.getString( 2 ),valores.getString( 3 ),
valores.getString( 4 )
}
);
}

//conexion.getSetenciaPreparada().close();
//conexion.cerrarConexion();
}
catch (SQLException ex)
{
JOptionPane.showMessageDialog( null, "ERROR DE EJECUCI\u00D3N DEL QUERY CONSULTAS obtenerPaciente SQLException \n\n" + ex.getMessage(), "ERROR DE SISTEMA 454", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog( null, "EN CONSULTAS obtenerPaciente ClassNotFoundException \n\n" + e.getMessage() , "ERROR DE SISTEMA 459", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
catch( NullPointerException e)
{
JOptionPane.showMessageDialog( null, "EN CONSULTAS obtenerPaciente NullPointerException \n\n" + e.toString() , "ERROR DE SISTEMA 464", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}

return datos;
}


public void exportarMySQL( Vector<Object[]> datos, int opcion ) throws SQLException
{
try
{
int indice = 1;

conexion.crearConexionMySQL();

for (Object[] objects : datos)
{
if( opcion == 1 )
{
conexion.setSetenciaPreparada(
conexion.getConexion().prepareStatement(
"INSERT INTO referencias ( IDReferencia,IDPaciente,IDUMedicaEnvia,IDUMedicaRef,cDescripcionRef,cServicio,cDiagnostico,cMotivoReferencia,cResumenClinico,cTratamiento,cFecha,IDMedico,cStatus,IdMotivo,cCompleta,dFecha_Cancelacion,IdPersonal_Cancela,cMotivo_Cancelacion,cUrgente,cNombreMedico,dFechaPrimeraAtencion,cStatusEnviado ) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"
)
);
}
else if( opcion == 2 )
{
conexion.setSetenciaPreparada(
conexion.getConexion().prepareStatement(
"INSERT INTO ContraReferencias (IDUMedica, IDContraReferencia, IDServicio, IDAreaMedica, cResumenClinico, cRecomendaciones, IDPersonal_Elabora, IDUnidadReferencia, IDReferencia, cObservaciones, dFecha_Reg, cStatus, dFecha_Cancelacion, IDPersonal_Cancela, cMotivo_Cancelacion, cNombreMedico, cStatusEnviado) VALUES( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )"
)
);
}
else
{
conexion.setSetenciaPreparada(
conexion.getConexion().prepareStatement(
"INSERT INTO Det_ContraReferencia_Diag ( IDUMedica,IDContraReferencia,IDDiagnostico,cDescripcion,cmotivocontrareferencia,IDReferencia ) VALUES( ?, ?, ?, ?, ?, ? )"
)
);
}

for( Object valores : objects )
{
conexion.getSetenciaPreparada().setObject( indice, valores );

++indice;
}
conexion.ejecutarConsultaModificar();

indice = 1;
}

//conexion.getSetenciaPreparada().close();
//conexion.cerrarConexion();
}
catch (SQLException ex)
{
JOptionPane.showMessageDialog( null, "ERROR DE EJECUCI\u00D3N DEL QUERY CONSULTAS exportarMySQL SQLException \n\n" + ex.getMessage(), "ERROR DE SISTEMA 131", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog( null, " EN CONSULTAS exportarMySQL ClassNotFoundException \n\n" + e.getMessage(), "ERROR DE SISTEMA 136", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
catch( NullPointerException e)
{
JOptionPane.showMessageDialog( null, " EN CONSULTAS exportarMySQL NullPointerException \n\n" + e.toString(), "ERROR DE SISTEMA 141", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
}



Código: java

mySystemTray.MensajeTrayIcon( "COMENZANDO CON LA B\u00DASQUEDA DE CONTRAREFERENCIA" , MessageType.INFO );
consulta.exportarMySQL( consulta.ObtenerContrareferencia(), 2 );

consulta.getConexion().aceptarSentencias();


f(consulta.getConexion().getConsultaExitosa() )
{
System.out.println("siii"); //Si entra aqui por lo tanto no hubo ningun error pero aun a si no se guarda nada
  propiedad.salvarConfiguracion();
}



Solo puse un poco de codigo de como lo estoy usando.

Y ese es mi problema que con InnoBD no esta gurdando nada pero sy cambio las tablas a MyISAM si se guardan los datos. pero el problema seria que si hay algun error los datos se salvarian incompletamente.

por eso lo de usar InnoDB.

Espero haberme explicado bien

No estoy seguro de que hace tu método getConexion() (ya que no muestras el code). al mismo lo llamas antes de la consulta y antes del commit.
Pero los commit y las tablas temporales son por sesión.
Por eso ten cuidado de no estar creando nuevas sesiones.

Saludos,

sabes, tienes razon la cosa va por alli, en la conexion ya que probe con sola una consulta y su funciono, pero a la hora de haer todas las consultas es cuando ya no

Código: java


propiedad.getPropiedad().setProperty( "ultimoRegistro", String.valueOf( consulta.obtenerTotalRegistros( 1 ) ) );
consulta.exportarMySQL( consulta.ObtenerReferencia() , 1 );
mySystemTray.MensajeTrayIcon( "COMENZANDO CON LA B\u00DASQUEDA DE PACIENTES" , MessageType.INFO );
//El segundo parametro puede ser cualquier cadena, ya que va entrar en la opcion 1 y no necesita el segundo parametro
//al menos que se entre a la opcion 2 alli si ocuparia el segundo parametro valido.
consulta.insertarPaciente( consulta.obtenerPaciente( 1 , "" ) );
mySystemTray.MensajeTrayIcon( "COMENZANDO CON LA B\u00DASQUEDA DE SOMATOMETRIA" , MessageType.INFO );
consulta.insertarSomatometria( consulta.obtenerSomatometria() );
mySystemTray.MensajeTrayIcon( "COMENZANDO CON LA B\u00DASQUEDA DE CONTRAREFERENCIA" , MessageType.INFO );
consulta.exportarMySQL( consulta.ObtenerContrareferencia(), 2 );
propiedad.getPropiedad().setProperty( "ultimaContrareferencia", String.valueOf( consulta.obtenerTotalRegistros( 2 ) ) );
mySystemTray.MensajeTrayIcon( "COMENZANDO CON LA B\u00DASQUEDA DETALLES DIAGN\u00D3STICOS DE EGRESO" , MessageType.INFO );
consulta.exportarMySQL( consulta.ObtenerDetContraReferenciaDiag(), 3 );
propiedad.getPropiedad().setProperty( "ultimoDetalleDiagnostico", String.valueOf( consulta.obtenerTotalRegistros( 3 ) ) );
propiedad.getPropiedad().setProperty( "checksum" , String.valueOf( consulta.seActualizoSomatometria() ) );
mySystemTray.MensajeTrayIcon( "FINALIZADO CORRECTAMENTE" , MessageType.INFO );

consulta.com();//Hace el  commit
//consulta.getConexion().cerrarConexion();

//System.out.println(consulta.getConexion().getConsultaExitosa());
if(consulta.getConexion().getConsultaExitosa() )
{
System.out.println("siii");
propiedad.salvarConfiguracion();
}


aqui estoy haciendo consultas tanto en SQL server como MySQL al mismo tiempo y me imagino que se queda la conexion del ultimo metodo que se accedio perdiendose las otras conexiones. Ya que en la clase consultar creo una Conexion MySQL o SQL server dependiendo del metodo y tal parece que al hacer eso se pierde y se queda con la ultima conexion.

Claro por que en ambos usas el mismo objeto (conexion).
Podrías tener 2 objetos de ese mismo tipo 1 para cada base de datos.

listo KARNAL. Ya pude hacerlo, gracias a tu  observacion.

lo que hice fue dividir la clase Conexion que construia tanto a SQL SERVER como a  MySQL a si que tengo una Conexion a SQL Server y otra clase Conexion a MySQL, tambien los metodos que llamaban a MySQL que se encontraban en la clase Consulta los quite de alli y los meti en otra clase aparte; tambien lo dividi, a si que tengo 2 clases Consultas  una Consulta SQL Server que llaman solamente a metodos SQL Server  y la otra ConsultasMySQL que llama solo a los metodos MYSQL.

A cada metodo le quite la parte donde se hacia una conexion ya sea a SQL Server ( conexion.crearConexionSQL()) o a MySQL (conexion.crearConexionMySQL() ) y estos metodos los pase a su respectivo constructor

Código: java

public Consultas( String servidor, String puerto, String nombre_base_datos, String usuario, String clave )
{
conexion = new Conexion( servidor , puerto , nombre_base_datos , usuario , clave );

try
{
conexion.crearConexionSQL();
} catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog( null, "EN Consultas Consultas ClassNotFoundException \n\n " + e.getMessage(), "ERROR DE SISTEMA 19", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
}


y para MySQL

Código: java

public ConsultasMySQL( String servidor, String puerto, String nombre_base_datos, String usuario, String clave )
{
conexion = new ConexionMySQL( servidor , puerto , nombre_base_datos , usuario , clave );

try
{
conexion.crearConexionMySQL();
} catch (ClassNotFoundException e)
{
JOptionPane.showMessageDialog( null, "EN ConsultasMySQL ConsultasMySQL ClassNotFoundException \n\n " + e.getMessage(), "ERROR DE SISTEMA 19", JOptionPane.ERROR_MESSAGE );
System.exit( 0 );
}
}


a si ya solamente creo una conexion de cada uno y no una conexion por cada metodo que entraba (tal y como me lo hiciste ver al decir que me fijara que no estuviera haciendo conexiones multiples ).

Ahora si, si hay algun dato mal de las tablas que consulto, esos datos ya no se enviarian y tampoco los datos anteriores en dado caso q si estubieran correctos.

Gracias.

Genial, me alegro mucho bro.

Quizás podrías ayudar a @No tienes permitido ver los links. Registrarse o Entrar a mi cuenta que en este tema consultaba como reutilizar las conexiones, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.
Ya que ahora tu la conectas en el constructor y luego usas siempre la misma.

Saludos y mucha suerte.