It  there  effective  way  to  persist  large  number  of  new objects
(approximately 20000 objects) to Oracle database?

Trying  to  persist in one transaction performs fine but slow (about 1
minute).

Trying  to  do  same  using  jdbc  PreparedStatement  and batch insert
performs slightly faster (about 10 seconds).

How to achieve same result using only OpenJPA?


Code sample using OpenJPA:

        long l = System.currentTimeMillis();
        // get 20000 records from Oracle database
        List<BalanceEnetData> beds = BalanceDAO.getBalanceEnetDataByPeriod(91l);
                                
        LinkedList<BalanceEnetData> newData = new LinkedList<BalanceEnetData>();
        for (BalanceEnetData bed : beds)
        {
            BalanceEnetData bed3 = (BalanceEnetData) ObjectCloner.clone(bed);
            bed3.setPeriod(2011l);
            newData.add(bed3);
        }

        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = null;
                        
        try
        {
            tx = em.getTransaction();
            tx.begin();
                                
            for(BalanceEnetData bed : newData)
            {
                 em.persist(bed);
            }

            tx.commit();
        }
        catch(Throwable t)
        {
             t.printStackTrace();
                                
             if(tx != null)
             {
                 tx.rollback();
             }
        }

Code sample using JDBC:

     long l = System.currentTimeMillis();
     // get 20000 records from Oracle database
     List<BalanceEnetData> beds = BalanceDAO.getBalanceEnetDataByPeriod(91l);

     try
     {
          long l1 = System.currentTimeMillis();
          Connection conn = datasource.getConnection();
          PreparedStatement st = conn.prepareStatement("insert into 
BAL_ENET_DATA(id, period, name) values (?, ?, ?)");
          for (BalanceEnetData bed : beds)
          {
               st.clearParameters();
               st.setLong(1, bed.getId());
               st.setLong(2, 1005);
               st.setString(3, "name");
               st.addBatch();
          }
          st.executeBatch();
     }
     catch (SQLException e)
     {
          e.printStackTrace();
     }

P.S. Oracle version 10gR2, OpenJPA 2.0.1

Reply via email to