Visual CSharp .NET - Oracle Bulk Copy

 
Vista:

Oracle Bulk Copy

Publicado por Francisco Vega (1 intervención) el 17/01/2012 20:36:16
Buenas tardes, quisiera pedirles una ayuda con esto ya estoy hasta la coronilla de estar lidiando con este problema por favor ayudenme

mi problema es el siguiente tengo un programa realizado en c# el cual esta encargado de copiar de una base a otra base, la verdad a mi parecer el programa funciona correctamente pero el lio esta en que al copiar una tabla que tiene 15 millones de registros a otra tabla que se encuentra en oracle salta el programa con el lio de que se quedo sin memoria y un monton de pendejadas mas que no me dicen nada. el programa toma los datos de una base desconocida por la humanidad que se llama MULTIBASE y por medio de odbc que es la unica forma de sacar datos de esa basura de base de datos los llena en un OdbcDataReader el cual lo carga perfectamente no hay ningun problema de ahi va hacia la parte del codigo que permite hacer un bulk copy a la tabla en oracle al momento de llegar a los 9 millones de registros el programa se cae diciendo que se quedo sin memoria y eso no es verdad por q se reviso el log de utilizacion de memoria ram y en total hasta los 9 millones de registros insertados en oracle hubo una utilizacion de ram de al rededor de los 6 gb de memoria ram y el servidor cuenta con 12 gb de memoria

por favor ayudenme no se que hacer sin esto no serviria la migracion de datos y me botan jjejejeje este es mi codigo fuente

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.Odbc;
using System.Data.OleDb;
using Oracle.DataAccess.Client;
using System.IO;
using System.Threading;

namespace ConsoleApplication1
{
class Program
{
static string log = "";

static void Main(string[] args)
{
GC.Collect();
String line;
DateTime x = DateTime.Now;
StreamWriter sw = File.CreateText("C:\\prueba\\log_" + x.Day.ToString() + "_" + x.Month.ToString() + "_" + x.Year.ToString() + "_" + x.Hour.ToString() + "_" + x.Minute.ToString() + "_" + x.Second.ToString() + ".txt");
sw.Close();
log = log + "Proceso de sincronización de bases de datos MULTIBASE a ORACLE\n";
log = log + x.Day.ToString() + "/" + x.Month.ToString() + "/" + x.Year.ToString() + " " + x.Hour.ToString() + ":" + x.Minute.ToString() + ":" + x.Second.ToString() + "\n";
try
{
OdbcConnection cn1 = new OdbcConnection("DSN=multiproduccion;UID=rmb06203;PWD=eugenia;");
cn1.Open();
StreamReader sr = new StreamReader("C:\\prueba\\livianos.txt");
line = sr.ReadLine();
Program a = new Program();
while (line != null)
{
try
{
a.empezar(line, x, cn1);
}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
log = log + "Exception: " + e.Message + "\n";
}
line = sr.ReadLine();
Thread.Sleep(4000);
}
sr.Close();
cn1.Close();

}
catch (Exception e)
{
Console.WriteLine("Exception: " + e.Message);
log = log + "Exception: " + e.Message + "\n";
}
finally
{
log = log + "FIN DE LA TRANSACCIÓN\n";
StreamWriter escribir1 = File.AppendText("C:\\prueba\\log_" + x.Day.ToString() + "_" + x.Month.ToString() + "_" + x.Year.ToString() + "_" + x.Hour.ToString() + "_" + x.Minute.ToString() + "_" + x.Second.ToString() + ".txt");
escribir1.WriteLine(log);
escribir1.Close();
Console.ReadLine();
}
}

public void empezar(string dato, DateTime k, OdbcConnection cn1)
{
string MyString, MyString1;
OdbcCommand cmd1;
OdbcDataReader dr;
using (OdbcConnection multibase1 = new OdbcConnection("DSN=multiproduccion;UID=rmb06203;PWD=eugenia;"))
using(OracleConnection con1 = new OracleConnection("Data Source=prueba;Password=prueba1;User ID=prueba1;"))
try
{
con1.Open();
DateTime n = DateTime.Now;
Console.WriteLine(n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->Select * from "+dato);
log = log + n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->Select * from "+dato;
MyString = "select * from "+dato;
MyString1 = "truncate table "+dato;
using (OdbcCommand cmd = new OdbcCommand(MyString, multibase1))
{
MyString = "select * from "+dato;
cmd1 = new OdbcCommand(MyString, cn1);
dr = cmd1.ExecuteReader(CommandBehavior.Default);
n = DateTime.Now;
Console.WriteLine(n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->Select * from " + dato + "(FIN)");
log = log + n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->Select * from " + dato + "(FIN)";
cmd1.Dispose();
multibase1.Dispose();
multibase1.Close();
}
using(OracleCommand cm1 = new OracleCommand(MyString1,con1)){
cm1.ExecuteNonQuery();
cm1.Dispose();
}
using(OracleBulkCopy bulkCopier1 = new OracleBulkCopy(con1,OracleBulkCopyOptions.UseInternalTransaction)){
n = DateTime.Now;
Console.WriteLine(n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->insert into " + dato);
log = log + n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->insert into " + dato;
GC.Collect();
bulkCopier1.BulkCopyTimeout = 6000000;
bulkCopier1.BatchSize = 10000;
bulkCopier1.DestinationTableName = dato;
bulkCopier1.WriteToServer(dr);
n = DateTime.Now;
Console.WriteLine(n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->insert into " + dato + "(FIN)");
log = log + n.Hour.ToString() + ":" + n.Minute.ToString() + ":" + n.Second.ToString() + "-->insert into " + dato + "(FIN)";
GC.Collect();
bulkCopier1.Dispose();
bulkCopier1.Close();
dr.Dispose();
dr.Close();
con1.Close();
}
}
catch (OracleException e)
{
Console.WriteLine("{0} Exception caught.", e);
Console.WriteLine();
Console.ReadLine();
}
catch (OdbcException e)
{
Console.WriteLine("{0} Exception caught.", e);
Console.WriteLine();
Console.ReadLine();
}
catch (Exception e)
{
Console.WriteLine("{0} Exception caught.", e);
Console.WriteLine();
Console.ReadLine();
}
}
}
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder