Try this:

       JpaTransactionManager transactionManager = new 
JpaTransactionManager(factory);

        TransactionTemplate template = new 
TransactionTemplate(transactionManager);
        template.execute(new TransactionCallbackWithoutResult()
        {
            @Override
            protected void doInTransactionWithoutResult(TransactionStatus 
status)
            {
                EntityManager em = 
EntityManagerFactoryUtils.getTransactionalEntityManager(factory);
                MyEntity entity = new MyEntity();
                em.persist(entity);
            }
        });

On Jan 31, 2013, at 5:49 PM, Chris Wolf <cwolf.a...@gmail.com> wrote:

> James,
> 
> Ok, now using TransactionTemplate, but I'm back to where I was - the
> same apparent connection "leak", only now
> the code is hideous with all those nested anonymous classes and whatnot... ;)
> 
> 
>   -Chris
> 
>    static void saveToDB(final List<MdBaseData> data) throws Exception {
>               EntityManagerFactory emf = Persistence
>                               .createEntityManagerFactory("marketdata");
>               
>               final JpaTemplate jpaTempl = new JpaTemplate(emf);
>               jpaTempl.afterPropertiesSet();
>               
>               JpaTransactionManager jpaTxMgr = new JpaTransactionManager(emf);
>               jpaTxMgr.afterPropertiesSet();
>               
>               final TransactionTemplate txTmpl = new 
> TransactionTemplate(jpaTxMgr);
>               txTmpl.afterPropertiesSet();
> 
>               TransactionStrategy txStrategy = new TransactionStrategy() {
>                       @SuppressWarnings("deprecation")
>                       public Object execute(final JpaCallback<?> callback) {
>                               return txTmpl.execute(new 
> TransactionCallback<Object>() {
>                                       public Object 
> doInTransaction(TransactionStatus status) {
>                                               return jpaTempl.execute(new 
> JpaCallback<Object>() {
>                                                       public Object 
> doInJpa(EntityManager entityManager)
>                                                                       throws 
> PersistenceException {
>                                                               return 
> callback.doInJpa(entityManager);
>                                                       }
>                                               });
>                                       }
>                               });
>                       }
>               };
>       
>               txStrategy.execute(new JpaCallback<Object>() {
>                       @Override
>                       public Object doInJpa(EntityManager em) throws 
> PersistenceException {
>                               for (MdBaseData bd : data) {
>                                       em.persist(bd);
>                               }
>                               return null; // writing to db, not reading...
>                       }                       
>               });
>    }
> 
> 
> On Thu, Jan 31, 2013 at 4:42 PM, James Carman
> <jcar...@carmanconsulting.com> wrote:
>> Try using TransactionTemplate.
>> 
>> On Jan 31, 2013, at 4:19 PM, Chris Wolf <cwolf.a...@gmail.com> wrote:
>> 
>>> James,
>>> 
>>> As per your suggestion, I let Spring manage the transactions and the
>>> apparent connection "leak" went away and I only see one connection
>>> being opened per session, as expected.
>>> 
>>> Unfortunately, nothing got inserted into the database.
>>> 
>>> Thanks,
>>> 
>>>  -Chris
>>> 
>>> My modified code looks like:
>>> 
>>> 
>>>   static void saveToDB(List<MdBaseData> data) throws Exception {
>>>              EntityManagerFactory emf = Persistence
>>>                              .createEntityManagerFactory("marketdata");
>>>              JpaTransactionManager jpaTxMgr = new 
>>> JpaTransactionManager(emf);
>>> 
>>> 
>>>              EntityManager em =
>>>                              
>>> jpaTxMgr.getEntityManagerFactory().createEntityManager();
>>>              TransactionStatus txStatus =
>>>                      jpaTxMgr.getTransaction(new 
>>> DefaultTransactionDefinition());
>>>              try {
>>>                      //em.getTransaction().begin();
>>>                      for (MdBaseData bd : data) {
>>>                              em.persist(bd);
>>>                      }
>>>                      //em.getTransaction().commit();
>>>                      jpaTxMgr.commit(txStatus);
>>>              } catch (Exception e) {
>>>                      jpaTxMgr.rollback(txStatus);
>>>                      e.printStackTrace();
>>>              } finally {
>>>                      //em.close();
>>>              }
>>>   }
>>> 
>>> On Thu, Jan 31, 2013 at 2:45 PM, James Carman
>>> <ja...@carmanconsulting.com> wrote:
>>>> Well, it looks like you're also managing your own transactions.
>>>> Perhaps just use Spring for the transaction management.
>>>> 
>>>> 
>>>> On Thu, Jan 31, 2013 at 2:35 PM, Chris Wolf <cwolf.a...@gmail.com> wrote:
>>>>> Right, I looked into that but the Spring docs say that JpaTemplate is
>>>>> deprecated in favor of native JPA APIs.
>>>>> 
>>>>> http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/orm/jpa/JpaTemplate.html
>>>>> 
>>>>> I am using OpenJPA-2.1
>>>>> 
>>>>> Thanks,
>>>>> 
>>>>>  -Chris
>>>>> 
>>>>> On Thu, Jan 31, 2013 at 2:29 PM, James Carman
>>>>> <ja...@carmanconsulting.com> wrote:
>>>>>> Well, you're managing your entity manager yourself, right?  You could
>>>>>> have a bug in there that's leaving it open?  Can you use Spring or
>>>>>> some other technology to do this for you in a way where you can be
>>>>>> sure everything gets cleaned up?
>>>>>> 
>>>>>> 
>>>>>> On Thu, Jan 31, 2013 at 2:28 PM, Chris Wolf <cwolf.a...@gmail.com> wrote:
>>>>>>> Howdy Matthias,
>>>>>>> 
>>>>>>> Yes, in an earlier post to this thread, I mentioned that 120
>>>>>>> connections were being opened (the max). So, yes, the max connections
>>>>>>> limit is being hit.
>>>>>>> 
>>>>>>> I observe this by tailing the TNS listener log
>>>>>>> 
>>>>>>> c:/app/<userId>/diag/tnslsnr/<userId>/listener/trace/listener.log
>>>>>>> 
>>>>>>> (Oracle-11g on Windows7)
>>>>>>> 
>>>>>>> 
>>>>>>> The question is why?  Unless I have a connection leak.
>>>>>>> 
>>>>>>>  -Chris
>>>>>>> 
>>>>>>> 
>>>>>>> On Thu, Jan 31, 2013 at 2:21 PM, Matthias Lüneberg
>>>>>>> <matthias.lueneb...@googlemail.com> wrote:
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> Is it possible that the oracle database has reached its max 
>>>>>>>> connections/processes limit?
>>>>>>>> 
>>>>>>>> I found an article: 
>>>>>>>> http://www.dadbm.com/2011/11/oracle-listener-refused-connection-ora-12519-troubleshooting/
>>>>>>>> 
>>>>>>>> Maybe its a database failure. Can you have a look at this?
>>>>>>>> 
>>>>>>>> HTH, Matthias
>>>>>>>> 
>>>>>>>> Am 31.01.2013 um 18:48 schrieb Chris Wolf <cwolf.a...@gmail.com>:
>>>>>>>> 
>>>>>>>>> James,
>>>>>>>>> 
>>>>>>>>> Here is what it looks like.  At first, I was using the "jpa://"
>>>>>>>>> endpoint, but then I needed to implement a custom processor to handle
>>>>>>>>> additional logic.  Thanks for having a look...
>>>>>>>>> 
>>>>>>>>> -Chris
>>>>>>>>> 
>>>>>>>>> from("file:/tmp/local/data?filter=#filter&preMove=/tmp/local/holding/${file:onlyname}.${id}&move=/tmp/local/archive&moveFailed=/tmp/local/errors&readLock=changed")
>>>>>>>>> .unmarshal(cpmdfileFormat)
>>>>>>>>> .processRef("dataStore")
>>>>>>>>> //.to("jpa:?persistenceUnit=marketdata")
>>>>>>>>> .beanRef("oneshotPoller", "resumeJpaConsumer"); // signal consumer
>>>>>>>>> route to begin
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> Bean for "dataStore":
>>>>>>>>> 
>>>>>>>>> public class CPMDPersister implements Processor {
>>>>>>>>>     private static final transient Logger log =
>>>>>>>>> LoggerFactory.getLogger(CPMDPersister.class);
>>>>>>>>>     IGenericDAO<MdBaseData> mdBaseDataDAO;
>>>>>>>>>     IGenericDAO<MdCurveData> mdCurveDataDAO;
>>>>>>>>> 
>>>>>>>>>     public CPMDPersister(){}
>>>>>>>>> 
>>>>>>>>>  public CPMDPersister(IGenericDAO<MdBaseData> mdBaseDataDAO,
>>>>>>>>> IGenericDAO<MdCurveData> mdCurveDataDAO) {
>>>>>>>>>     this.mdBaseDataDAO = mdBaseDataDAO;
>>>>>>>>>     this.mdCurveDataDAO = mdCurveDataDAO;
>>>>>>>>>  }
>>>>>>>>> 
>>>>>>>>>     @Override
>>>>>>>>>     public void process(Exchange exchange) throws Exception {
>>>>>>>>>             Message inMsg = exchange.getIn();
>>>>>>>>> 
>>>>>>>>>             @SuppressWarnings("unchecked")
>>>>>>>>>             List<MdBaseData> mdBaseData =
>>>>>>>>> (ArrayList<MdBaseData>)inMsg.getBody(ArrayList.class);
>>>>>>>>> 
>>>>>>>>>             IntervalElapsedTimer avg = new IntervalElapsedTimer();
>>>>>>>>>             avg.start();
>>>>>>>>>             mdBaseDataDAO.begin();
>>>>>>>>> 
>>>>>>>>>             for (MdBaseData md : mdBaseData) {
>>>>>>>>>                     setParentReferences(md);
>>>>>>>>>                     mdBaseDataDAO.save(md);
>>>>>>>>>                 avg.lap();
>>>>>>>>>                 log.debug("JPA Persist MD: {}, {}",
>>>>>>>>>                     new Object[] {md.toString(), avg.toString()});
>>>>>>>>>             }
>>>>>>>>> 
>>>>>>>>>             mdBaseDataDAO.commit();
>>>>>>>>> 
>>>>>>>>>             log.debug("JPA Persist: {}", avg.toString());
>>>>>>>>>             int a = 0;
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>>     void setParentReferences(MdBaseData md) {
>>>>>>>>>             for (MdCurveData cd : md.getMdCurveData()) {
>>>>>>>>>                     if (cd.getMdBaseData() == null)
>>>>>>>>>                             cd.setMdBaseData(new 
>>>>>>>>> ArrayList<MdBaseData>());
>>>>>>>>>                     if (!cd.getMdBaseData().contains(md))
>>>>>>>>>                             cd.getMdBaseData().add(md);
>>>>>>>>>             }
>>>>>>>>>     }
>>>>>>>>> }
>>>>>>>>> 
>>>>>>>>> The DAOs, are a thin wrapper around EntityManager, like:
>>>>>>>>> 
>>>>>>>>>     @SuppressWarnings("unchecked")
>>>>>>>>>     public List<T> findAll() {
>>>>>>>>>             return entityManager.createQuery("from " + 
>>>>>>>>> entityType.getName())
>>>>>>>>>                             .getResultList();
>>>>>>>>>     }
>>>>>>>>>     public void begin() {
>>>>>>>>>             this.entityManager.getTransaction().begin();
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>>     public void commit() {
>>>>>>>>>             this.entityManager.getTransaction().commit();
>>>>>>>>>             this.entityManager.clear();
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>>     public void rollback() {
>>>>>>>>>             this.entityManager.getTransaction().rollback();
>>>>>>>>>     }
>>>>>>>>> 
>>>>>>>>> On Thu, Jan 31, 2013 at 12:34 PM, James Carman
>>>>>>>>> <ja...@carmanconsulting.com> wrote:
>>>>>>>>>> What does your route look like?
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> On Thu, Jan 31, 2013 at 11:58 AM, Chris Wolf <cwolf.a...@gmail.com> 
>>>>>>>>>> wrote:
>>>>>>>>>>> I have further determined that it's an OpenJPA issue (or user error,
>>>>>>>>>>> but how can that be?) ;)
>>>>>>>>>>> 
>>>>>>>>>>> I will report back when I get to the bottom of it.  Thanks a lot,
>>>>>>>>>>> 
>>>>>>>>>>> Chris
>>>>>>>>>>> 
>>>>>>>>>>> On Sat, Jan 26, 2013 at 2:47 AM, Willem Jiang 
>>>>>>>>>>> <willem.ji...@gmail.com> wrote:
>>>>>>>>>>>> Can you share us your camel route? It is important for us to find 
>>>>>>>>>>>> out the key reason of your issue.
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>>>>>> 发自我的 iPhone
>>>>>>>>>>>> 
>>>>>>>>>>>> 在 2013-1-26,上午5:22,Chris Wolf <cwolf.a...@gmail.com> 写道:
>>>>>>>>>>>> 
>>>>>>>>>>>>> On Fri, Jan 25, 2013 at 3:55 PM, Chris Wolf 
>>>>>>>>>>>>> <cwolf.a...@gmail.com> wrote:
>>>>>>>>>>>>>> I ask because when I use jpa:  in producer mode, I get this 
>>>>>>>>>>>>>> error:
>>>>>>>>>>>>>> Caused by: oracle.net.ns.NetException: Listener refused the 
>>>>>>>>>>>>>> connection
>>>>>>>>>>>>>> with the following error:
>>>>>>>>>>>>>> ORA-12519, TNS:no appropriate service handler found
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Strangely, using  jpa: in consumer mode, this does not happen.  
>>>>>>>>>>>>>> In the
>>>>>>>>>>>>>> tnslsnr.log, I observe 120 connections being opened when
>>>>>>>>>>>>>> running the route with jpa: in producer mode.  If I instead use a
>>>>>>>>>>>>>> custom Processor and do my own JPA persistence code,
>>>>>>>>>>>>>> the issue does not occur.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Thanks for any advice,
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Chris
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I stepped through with the debugger and the problem went away.  
>>>>>>>>>>>>> The
>>>>>>>>>>>>> point at which a lot of connections were opened was
>>>>>>>>>>>>> after I stepped over:
>>>>>>>>>>>>> 
>>>>>>>>>>>>>             return jpaTemplate.execute(new JpaCallback<Object>() {
>>>>>>>>>>>>>                 public Object doInJpa(EntityManager entityManager)
>>>>>>>>>>>>> throws PersistenceException {
>>>>>>>>>>>>>                     return callback.doInJpa(entityManager);
>>>>>>>>>>>>>                 }
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ..and when running in real time (not debugging) it seems to be 
>>>>>>>>>>>>> running
>>>>>>>>>>>>> in an AsyncProcessor - I wonder if it's too many worker
>>>>>>>>>>>>> threads eating up the connections?  BTW, this is mt first project
>>>>>>>>>>>>> using Camel, so forgive the lack of experience...
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] UnmarshallingContext           
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> EOF reached at line 2007
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] SendProcessor                  
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>>>>>> Endpoint[jpa://?persistenceUnit=marketdata] Exchange[null]
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] JpaTransactionManager          
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Creating new transaction with name [null]:
>>>>>>>>>>>>> PROPAGATION_REQUIRED,ISOLATION_DEFAULT
>>>>>>>>>>>>> 8505  marketdata  INFO   [Camel (camel-1) thread #1 -
>>>>>>>>>>>>> file:///tmp/local/data] openjpa.Runtime - Starting OpenJPA 2.2.1
>>>>>>>>>>>>> 8535  marketdata  INFO   [Camel (camel-1) thread #1 -
>>>>>>>>>>>>> file:///tmp/local/data] openjpa.jdbc.JDBC - Using dictionary class
>>>>>>>>>>>>> "org.apache.openjpa.jdbc.sql.OracleDictionary".
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] JpaTransactionManager          
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Opened new EntityManager
>>>>>>>>>>>>> [org.apache.openjpa.persistence.EntityManagerImpl@798b429b] for 
>>>>>>>>>>>>> JPA
>>>>>>>>>>>>> transaction
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] JpaTransactionManager          
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Initiating transaction commit
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] JpaTransactionManager          
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Committing JPA transaction on EntityManager
>>>>>>>>>>>>> [org.apache.openjpa.persistence.EntityManagerImpl@798b429b]
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] JpaTransactionManager          
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Closing JPA EntityManager
>>>>>>>>>>>>> [org.apache.openjpa.persistence.EntityManagerImpl@798b429b] after
>>>>>>>>>>>>> transaction
>>>>>>>>>>>>> [ad #1 - file:///tmp/local/data] EntityManagerFactoryUtils      
>>>>>>>>>>>>> DEBUG
>>>>>>>>>>>>> Closing JPA EntityManager
>>>>>>>> 
>> 

Reply via email to