Armin, thanks for your reply.
But one more thing. I use table with something like 100 000 records.
Using of PB.getCollectionByQuery may couse problems with memory. Out
Of Memory Exception for example. This is not a problem - I can
increase heap size for JVM, etc.In this case using
PB.getIteratorByQuery sounds logic, I think. How I can use multiply
repository profiles and still use PB.getIteratorByQuery ? I thik it
will be coll when I can dynamically change only table name and operate
with same object but in different db. Mapping for particular object I
have alredy, one thing I need to be changed at runtime is  table name.
Is it possible in fact to work with big data sets in few RDBMSs ?
Anyone have such expirience ? Thank you.


On Mon, 11 Apr 2005 11:40:16 +0200, Armin Waibel <[EMAIL PROTECTED]> wrote:
> Hi,
> 
> Stas Ostapenko wrote:
> > I have a problem with inserting all table data of one table to another
> > table in other RDBMS. Following code works, but it stores not all the
> > data, but only first object.
> > Where I`m wrong ?
> 
> First you have to take care that metadata changes are global operations, 
> all metadata are shared.
> http://db.apache.org/ojb/docu/guides/metadata.html#Global%0A++++++++++++++++++++
> 
> If you change the table name of a class-descriptor all other PB/threads 
> will use the changed table name.
> 
> In a single threaded application you can change metadata in the 
> following way:
> 
> - Lookup the PB of the source DB
> - get the objects you want to copy, use PB.getCollectionByQuery instead 
> of PB.getIteratorByQuery (to guarantee that the objects be materialized 
> before the metadata change, avoid lazy materialization settings in
> metadata)
> - close the PB
> - change the table name
> - Lookup PB for target DB
> - begin PB-tx
> - loop and copy
> - PB-tx commit
> 
> A more elegant and multithreaded safe solution will be the usage of 
> different metadata profiles. You have a "normal" repository file with 
> all class-descriptor (with source table names) and an additionally 
> "profile" repository file with all class-descriptor using the target DB 
> table names. This profile is read at runtime (e.g. at start of your 
> application) and you are using the MetadataManager to setup a "source" 
> and a "target" metadata-profile. More detailed info here
> 
> http://db.apache.org/ojb/docu/guides/metadata.html#Per+thread+metadata+changes
> 
> regards,
> Armin
> 
> 
> > Please help.
> > 
> > import org.apache.ojb.broker.PersistenceBroker;
> > import org.apache.ojb.broker.PersistenceBrokerException;
> > import org.apache.ojb.broker.PersistenceBrokerFactory;
> > import org.apache.ojb.broker.query.QueryByCriteria;
> > import org.apache.ojb.broker.query.Criteria;
> > import org.apache.ojb.broker.metadata.DescriptorRepository;
> > import org.apache.ojb.broker.metadata.FieldDescriptor;
> > import org.apache.ojb.broker.metadata.MetadataManager;
> > import org.apache.ojb.broker.metadata.ClassDescriptor;
> > 
> > import java.util.Iterator;
> > 
> > public class From_MySQL_2_HSQL_DB_testing
> > {
> >     public static void main(String args[])
> >     {
> >     PersistenceBroker hsql_db_broker = null;
> > 
> >     PersistenceBroker mysql_db_broker = null;
> > 
> >     Object result = null;
> > 
> >     ClassDescriptor hsql_db_Domain_classDescriptor  = null;
> >     ClassDescriptor mysql_db_Domain_classDescriptor = null;
> >     try
> >     {
> >         hsql_db_broker =
> > PersistenceBrokerFactory.createPersistenceBroker("HSQL_OJB_Files",
> > "root", "");
> > 
> >     mysql_db_broker =
> > PersistenceBrokerFactory.createPersistenceBroker("MySQL_Main_Database",
> > "root", "");
> > 
> >     hsql_db_Domain_classDescriptor =
> > hsql_db_broker.getClassDescriptor(Domain.class);
> >     hsql_db_Domain_classDescriptor.setTableName("hsqldb_domain");
> > 
> >     mysql_db_Domain_classDescriptor =
> > mysql_db_broker.getClassDescriptor(Domain.class);
> >     mysql_db_Domain_classDescriptor.setTableName("domain");
> > 
> >         Criteria criteria = new Criteria();
> > 
> >         criteria.addLike("Domain", "%");
> >         QueryByCriteria query = new QueryByCriteria(Domain.class,
> criteria);
> > 
> >     Iterator bdIterator = mysql_db_broker.getIteratorByQuery(query);
> > 
> >         while(bdIterator.hasNext())
> >         {
> >     mysql_db_Domain_classDescriptor.setTableName("domain");
> >     result = bdIterator.next();
> > 
> >     hsql_db_Domain_classDescriptor.setTableName("hsqldb_domain");
> >             hsql_db_broker.beginTransaction();
> >                     hsql_db_broker.store(result);
> >             hsql_db_broker.commitTransaction();
> >     System.out.println(((Domain)result).Name);
> >         }
> >     }
> >         catch(Exception e)
> >             {
> >             e.printStackTrace();
> >             }
> >         finally
> >         {
> >             //close HSQLDB connection
> >             hsql_db_broker.close();
> > 
> >             //close MySQL connection
> >             mysql_db_broker.close();
> >         }
> >     }
> > }
> > 
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: [EMAIL PROTECTED]
> > For additional commands, e-mail: [EMAIL PROTECTED]
> > 
> > 
> > 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to