Ejecutar sentencias por lotes.
Nos basaremos para el ejemplo en tres métodos de Statement:
Creamos un método que reciba una lista de sentencias y las ejecuta por lotes:
public int[] ejecutaPorLotes(List sentencias) {
Connection conn = getConnection();
int[] resultado = null;
Statement st = null;
try {
st = conn.createStatement();
for (int i = 0; i < sentencias.size(); i++) {
String sentencia = (String) sentencias.get(i);
st.addBatch(sentencia);
}
resultado = st.executeBatch();
st.clearBatch();
return resultado;
} catch (SQLException e) {
e.printStackTrace();
return resultado;
} finally {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Vamos a probar el código:
public static void main(String[] args) {
CaracteristicasJDBC car = new CaracteristicasJDBC();
ArrayList lista = new ArrayList();
lista.add("INSERT INTO USUARIOS VALUES ('Pepe',19)");
lista.add("INSERT INTO USUARIOS VALUES ('Juan',21)");
int[] resultado = car.ejecutaPorLotes(lista);
for(int i=0;i
System.out.println("resultado: "+resultado[i]);
}
}
Ejecutamos y vemos la consola:
Comprobamos los datos en la tabla:
Nos basaremos para el ejemplo en tres métodos de Statement:
- addBatch(String sentencia). Añade una sentencia a la lista de sentencias por lotes.
- executeBatch(). Ejecuta la lista de sentencias por lotes. Retorna un array de enteros con el resultado de cada sentencia.
- clearBatch(). Limpia la lista de sentencias por lotes.
Creamos un método que reciba una lista de sentencias y las ejecuta por lotes:
public int[] ejecutaPorLotes(List sentencias) {
Connection conn = getConnection();
int[] resultado = null;
Statement st = null;
try {
st = conn.createStatement();
for (int i = 0; i < sentencias.size(); i++) {
String sentencia = (String) sentencias.get(i);
st.addBatch(sentencia);
}
resultado = st.executeBatch();
st.clearBatch();
return resultado;
} catch (SQLException e) {
e.printStackTrace();
return resultado;
} finally {
if (st != null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Vamos a probar el código:
public static void main(String[] args) {
CaracteristicasJDBC car = new CaracteristicasJDBC();
ArrayList lista = new ArrayList();
lista.add("INSERT INTO USUARIOS VALUES ('Pepe',19)");
lista.add("INSERT INTO USUARIOS VALUES ('Juan',21)");
int[] resultado = car.ejecutaPorLotes(lista);
for(int i=0;i
System.out.println("resultado: "+resultado[i]);
}
}
Ejecutamos y vemos la consola:
Comprobamos los datos en la tabla:
Hola.
ResponderEliminarYo no se si lo estoy haciendo bien, pero hago lo mismo, y funcionar funciona, pero tengo la sensación de que se está introduciendo en la bbdd un solo campo a la vez ... luego es muuuuy lento
Este es mi código:
public void insertarDatos (ArrayList lista){
Connection connection = null;
PreparedStatement statement = null;
try {
connection = getCx();
statement = connection.prepareStatement("INSERT INTO logs (ip,time,request,referer,httpcode) VALUES (?,?,?,?,?)");
for (int i = 0; i < lista.size(); i++) {
BeanLog bl = (BeanLog)lista.get(i);
statement.setString(1, bl.getIp());
statement.setString(2, bl.getTime());
statement.setString(3, bl.getRequest());
statement.setString(4, bl.getReferer());
statement.setInt(5, bl.getHttpcode());
statement.addBatch();
if ((i + 1) % 1000 == 0) {
statement.executeBatch(); // Ejecuto cada 1000 items.
}
}
qwertyuiop
ResponderEliminar