Programa JDBC cuelga
Publicado por Salva (1 intervención) el 21/10/2010 17:26:16
Buenas
Tengo una aplicacion que extrae datos de una BD mediante JDBC y vuelca el contenido a un fichero plano
Esta aplicacion es capaz de conectar contra informix y Oracle.
resulta que mi aplicacion contra informix hace su trabajo correctamente. El problema viene con Oracle cuando se encuentra con una tabla con muchos datos (unos 3 millones) el proceso de mi aplicacion empieza a crecer hasta que consume casi toda la memoria del equipo y se cuelga.
Cuando conecto a Infomix el codigo es el mismo y la tabla la misma, pero el proceso termina correctamente, asi que solo se me ocurre que tenga algo que ver el driver, uso el driver ojdbc4_g.jar
Alguna pista?? gracias
Este es parte del codigo que uso para descargar los datos
private boolean montaScript(String tabla, PrintStream out_file) {
boolean resultado = true;
String sql_cab = "INSERT INTO " + tabla + " (";
String sql;
ResultSet rs = null;
ResultSetMetaData rsmt = null;
String dato = "";
//Variables para lso tipos fecha
System.out.println("Generando: " + tabla);
Date fecha = null;
String mesTrans = "";
SimpleDateFormat mes = new SimpleDateFormat("MM");
SimpleDateFormat dia = new SimpleDateFormat("dd");
SimpleDateFormat anio = new SimpleDateFormat("yyyy");
try {
st = common.conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = st.executeQuery("select * from " + tabla);
rsmt = rs.getMetaData();
//Monto la lista de tablas a insertar.
for (int i = 1; i <= rsmt.getColumnCount(); i++) {
sql_cab = sql_cab + rsmt.getColumnName(i).toLowerCase();
if (i == rsmt.getColumnCount()) {
sql_cab = sql_cab + ") VALUES( ";
} else {
sql_cab = sql_cab + ",";
}
}
rs.first();
if (rs.getRow() != 0) {
do {
sql = sql_cab;
for (int j = 1; j <= rsmt.getColumnCount(); j++) {
//Tipos de datos decimales
if (rsmt.getColumnType(j) == 2 || rsmt.getColumnType(j) == 3 || rsmt.getColumnType(j) == 6 || rsmt.getColumnType(j) == 8) {
dato = rs.getString(j);
if (!common.isNull(dato)) {
if (jComboBox5.getSelectedItem().toString().equals("Coma")) {
dato = dato.replace(".", ",");
} else {
dato = dato.replace(",", ".");
}
}
//Fecha
} else if (rsmt.getColumnType(j) == 91 || rsmt.getColumnType(j) == 93 || rsmt.getColumnType(j) == 92) {
fecha = rs.getDate(j);
if (fecha != null) {
if (jComboBox6.getSelectedItem().toString().equals("dd/mm/yyyy")) {
dato = dia.format(fecha) + "/" + mes.format(fecha) + "/" + anio.format(fecha);
} else if (jComboBox6.getSelectedItem().toString().equals("yyyy/mm/dd")) {
dato = anio.format(fecha) + "/" + mes.format(fecha) + "/" + dia.format(fecha);
} else {
if (mes.format(fecha).equals("01")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "jan";
} else {
mesTrans = "ene";
}
} else if (mes.format(fecha).equals("02")) {
mesTrans = "feb";
} else if (mes.format(fecha).equals("03")) {
mesTrans = "mar";
} else if (mes.format(fecha).equals("04")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "apr";
} else {
mesTrans = "abr";
}
} else if (mes.format(fecha).equals("05")) {
mesTrans = "may";
} else if (mes.format(fecha).equals("06")) {
mesTrans = "jun";
} else if (mes.format(fecha).equals("07")) {
mesTrans = "jul";
} else if (mes.format(fecha).equals("08")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "aug";
} else {
mesTrans = "ago";
}
} else if (mes.format(fecha).equals("09")) {
mesTrans = "sep";
} else if (mes.format(fecha).equals("10")) {
mesTrans = "oct";
} else if (mes.format(fecha).equals("11")) {
mesTrans = "nov";
} else if (mes.format(fecha).equals("12")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "dec";
} else {
mesTrans = "dic";
}
}
dato = dia.format(fecha) + "-" + mesTrans + "-" + anio.format(fecha);
}
} else {
dato = "";
}
} else {
dato = rs.getString(j);
}
if (common.isNull(dato)) {
sql = sql + "NULL";
} else {
sql = sql + "'" + dato.replace("'", " ").replace(";", " ") + "'";
}
if (j == rsmt.getColumnCount()) {
sql = sql + ");";
} else {
sql = sql + ",";
}
}
out_file.println(sql);
} while (rs.next());
}
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return resultado;
}
Tengo una aplicacion que extrae datos de una BD mediante JDBC y vuelca el contenido a un fichero plano
Esta aplicacion es capaz de conectar contra informix y Oracle.
resulta que mi aplicacion contra informix hace su trabajo correctamente. El problema viene con Oracle cuando se encuentra con una tabla con muchos datos (unos 3 millones) el proceso de mi aplicacion empieza a crecer hasta que consume casi toda la memoria del equipo y se cuelga.
Cuando conecto a Infomix el codigo es el mismo y la tabla la misma, pero el proceso termina correctamente, asi que solo se me ocurre que tenga algo que ver el driver, uso el driver ojdbc4_g.jar
Alguna pista?? gracias
Este es parte del codigo que uso para descargar los datos
private boolean montaScript(String tabla, PrintStream out_file) {
boolean resultado = true;
String sql_cab = "INSERT INTO " + tabla + " (";
String sql;
ResultSet rs = null;
ResultSetMetaData rsmt = null;
String dato = "";
//Variables para lso tipos fecha
System.out.println("Generando: " + tabla);
Date fecha = null;
String mesTrans = "";
SimpleDateFormat mes = new SimpleDateFormat("MM");
SimpleDateFormat dia = new SimpleDateFormat("dd");
SimpleDateFormat anio = new SimpleDateFormat("yyyy");
try {
st = common.conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
rs = st.executeQuery("select * from " + tabla);
rsmt = rs.getMetaData();
//Monto la lista de tablas a insertar.
for (int i = 1; i <= rsmt.getColumnCount(); i++) {
sql_cab = sql_cab + rsmt.getColumnName(i).toLowerCase();
if (i == rsmt.getColumnCount()) {
sql_cab = sql_cab + ") VALUES( ";
} else {
sql_cab = sql_cab + ",";
}
}
rs.first();
if (rs.getRow() != 0) {
do {
sql = sql_cab;
for (int j = 1; j <= rsmt.getColumnCount(); j++) {
//Tipos de datos decimales
if (rsmt.getColumnType(j) == 2 || rsmt.getColumnType(j) == 3 || rsmt.getColumnType(j) == 6 || rsmt.getColumnType(j) == 8) {
dato = rs.getString(j);
if (!common.isNull(dato)) {
if (jComboBox5.getSelectedItem().toString().equals("Coma")) {
dato = dato.replace(".", ",");
} else {
dato = dato.replace(",", ".");
}
}
//Fecha
} else if (rsmt.getColumnType(j) == 91 || rsmt.getColumnType(j) == 93 || rsmt.getColumnType(j) == 92) {
fecha = rs.getDate(j);
if (fecha != null) {
if (jComboBox6.getSelectedItem().toString().equals("dd/mm/yyyy")) {
dato = dia.format(fecha) + "/" + mes.format(fecha) + "/" + anio.format(fecha);
} else if (jComboBox6.getSelectedItem().toString().equals("yyyy/mm/dd")) {
dato = anio.format(fecha) + "/" + mes.format(fecha) + "/" + dia.format(fecha);
} else {
if (mes.format(fecha).equals("01")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "jan";
} else {
mesTrans = "ene";
}
} else if (mes.format(fecha).equals("02")) {
mesTrans = "feb";
} else if (mes.format(fecha).equals("03")) {
mesTrans = "mar";
} else if (mes.format(fecha).equals("04")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "apr";
} else {
mesTrans = "abr";
}
} else if (mes.format(fecha).equals("05")) {
mesTrans = "may";
} else if (mes.format(fecha).equals("06")) {
mesTrans = "jun";
} else if (mes.format(fecha).equals("07")) {
mesTrans = "jul";
} else if (mes.format(fecha).equals("08")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "aug";
} else {
mesTrans = "ago";
}
} else if (mes.format(fecha).equals("09")) {
mesTrans = "sep";
} else if (mes.format(fecha).equals("10")) {
mesTrans = "oct";
} else if (mes.format(fecha).equals("11")) {
mesTrans = "nov";
} else if (mes.format(fecha).equals("12")) {
if (jComboBox6.getSelectedItem().toString().equals("ENG dd-mmm-yyyy")) {
mesTrans = "dec";
} else {
mesTrans = "dic";
}
}
dato = dia.format(fecha) + "-" + mesTrans + "-" + anio.format(fecha);
}
} else {
dato = "";
}
} else {
dato = rs.getString(j);
}
if (common.isNull(dato)) {
sql = sql + "NULL";
} else {
sql = sql + "'" + dato.replace("'", " ").replace(";", " ") + "'";
}
if (j == rsmt.getColumnCount()) {
sql = sql + ");";
} else {
sql = sql + ",";
}
}
out_file.println(sql);
} while (rs.next());
}
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
}
return resultado;
}
Valora esta pregunta
0