persistence@glassfish.java.net

Re: entity manager flush problem

From: Marina Vatkina <marina.vatkina_at_oracle.com>
Date: Fri, 06 Aug 2010 15:14:21 -0700

Do you see inserts and updates if you switch to use EclipseLink?

Oleg Mayevskiy wrote:
> I call it via localInterface invokation from a simple servlet.
>
> Am 06.08.2010 23:05, schrieb Marina Vatkina:
>> How do you call this method?
>>
>> Oleg Mayevskiy wrote:
>>> yes the transaction commits, and the business method exits too, but
>>> there are no update or insert statements in the transaction.
>>> also if i add an em.flush() at the end of the business method, then
>>> update statements are done.
>>>
>>> Am 06.08.2010 21:43, schrieb Marina Vatkina:
>>>> Do you wait until transaction commits, or do you check before the
>>>> business method exits?
>>>>
>>>>
>>>> Oleg Mayevskiy wrote:
>>>>> I am watching database statement logs, also tables that should be
>>>>> filled with new data. Additional i see all statements produced by
>>>>> hibernate in java logs, because of hibernate.show_sql property.
>>>>>
>>>>> Am 06.08.2010 20:58, schrieb Marina Vatkina:
>>>>>> Hi Oleg,
>>>>>>
>>>>>> How do you check that nothing is flushed to the database?
>>>>>>
>>>>>> -marina
>>>>>>
>>>>>> Oleg Mayevskiy wrote:
>>>>>>> Hi.
>>>>>>>
>>>>>>> I have a question about a following abstract problem.
>>>>>>>
>>>>>>> i have a stateless bean like this:
>>>>>>>
>>>>>>> @Stateless
>>>>>>>
>>>>>>> Public class MyBean implements MyLocalInterface {
>>>>>>>
>>>>>>> ….
>>>>>>>
>>>>>>> @PersistenceContext(unitName = "ReadWritePU")
>>>>>>> private EntityManager em;
>>>>>>>
>>>>>>> ….
>>>>>>>
>>>>>>> @Override
>>>>>>>
>>>>>>> public void execute() {
>>>>>>>
>>>>>>> …
>>>>>>>
>>>>>>> em.find(…) (some finds)
>>>>>>>
>>>>>>> …
>>>>>>>
>>>>>>> em.merge(…) (some merges)
>>>>>>>
>>>>>>> …
>>>>>>>
>>>>>>> em.persist(…) (some persists)
>>>>>>>
>>>>>>> }
>>>>>>>
>>>>>>> but what happens on db is:
>>>>>>>
>>>>>>> BEGIN
>>>>>>> some SELECTs(from some finds)
>>>>>>> ....
>>>>>>> COMMIT
>>>>>>>
>>>>>>> so what happens is, entity manager does not flush the objects
>>>>>>> from merge and persist methods, no updates or inserts are done
>>>>>>> to the database. Also no Runtime Exceptions are thrown.
>>>>>>>
>>>>>>> But if i put an em.flush() at the end of the business method,
>>>>>>> every thing is ok and new objects are flushed to the db.
>>>>>>>
>>>>>>> What could be a reason for this behavior?
>>>>>>>
>>>>>>> I tried to change non-transactional-connections from false to
>>>>>>> true, the transaction-isolation-level from serializable to
>>>>>>> read-commited
>>>>>>> and is-isolation-level-guaranteed from true to false, but it did
>>>>>>> not help.
>>>>>>>
>>>>>>>
>>>>>>> Here is my whole persistence.xml
>>>>>>>
>>>>>>> <?xml version="1.0" encoding="UTF-8"?>
>>>>>>>
>>>>>>> <persistence version="1.0"
>>>>>>> xmlns="http://java.sun.com/xml/ns/persistence"
>>>>>>> <http://java.sun.com/xml/ns/persistence>
>>>>>>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>>>>>>> <http://www.w3.org/2001/XMLSchema-instance>
>>>>>>> xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
>>>>>>> http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
>>>>>>> <http://java.sun.com/xml/ns/persistencehttp:/java.sun.com/xml/ns/persistence/persistence_1_0.xsd>>
>>>>>>>
>>>>>>>
>>>>>>> <persistence-unit name="ReadWritePU" transaction-type="JTA">
>>>>>>>
>>>>>>> <provider>org.hibernate.ejb.HibernatePersistence</provider>
>>>>>>>
>>>>>>> <jta-data-source>jdbc/Postgres</jta-data-source>
>>>>>>>
>>>>>>> <exclude-unlisted-classes>false</exclude-unlisted-classes>
>>>>>>>
>>>>>>> <properties>
>>>>>>>
>>>>>>> <property name="hibernate.show_sql" value="true"/>
>>>>>>>
>>>>>>> <property name="hibernate.dialect"
>>>>>>> value="org.hibernate.dialect.PostgreSQLDialect"/>
>>>>>>>
>>>>>>> <property name="hibernate.order_updates" value="true"/>
>>>>>>>
>>>>>>> <property name="hibernate.transaction.manager_lookup_class"
>>>>>>> value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
>>>>>>>
>>>>>>> <property name="hibernate.transaction.factory_class"
>>>>>>> value="org.hibernate.transaction.CMTTransactionFactory"/>
>>>>>>>
>>>>>>> </properties>
>>>>>>>
>>>>>>> </persistence-unit>
>>>>>>>
>>>>>>> <persistence-unit name="ReadOnlyPU" transaction-type="JTA">
>>>>>>>
>>>>>>> <provider>org.hibernate.ejb.HibernatePersistence</provider>
>>>>>>>
>>>>>>> <jta-data-source>jdbc/PostgresReadonly</jta-data-source>
>>>>>>>
>>>>>>> <exclude-unlisted-classes>false</exclude-unlisted-classes>
>>>>>>>
>>>>>>> <properties>
>>>>>>>
>>>>>>> <property name="hibernate.dialect"
>>>>>>> value="org.hibernate.dialect.PostgreSQLDialect"/>
>>>>>>>
>>>>>>> <property name="hibernate.show_sql" value="true"/>
>>>>>>>
>>>>>>> <property name="hibernate.transaction.manager_lookup_class"
>>>>>>> value="org.hibernate.transaction.SunONETransactionManagerLookup"/>
>>>>>>>
>>>>>>> <property name="hibernate.transaction.factory_class"
>>>>>>> value="org.hibernate.transaction.CMTTransactionFactory"/>
>>>>>>>
>>>>>>> </properties>
>>>>>>>
>>>>>>> </persistence-unit>
>>>>>>>
>>>>>>> </persistence>
>>>>>>>
>>>>>>> And here are my connection pool settings from the domain.xml
>>>>>>>
>>>>>>> <jdbc-connection-pool allow-non-component-callers="true"
>>>>>>> associate-with-thread="false"
>>>>>>> connection-creation-retry-attempts="0"
>>>>>>> connection-creation-retry-interval-in-seconds="10"
>>>>>>> connection-leak-reclaim="false"
>>>>>>> connection-leak-timeout-in-seconds="0"
>>>>>>> connection-validation-method="table"
>>>>>>> datasource-classname="org.postgresql.ds.PGConnectionPoolDataSource"
>>>>>>> fail-all-connections="false" idle-timeout-in-seconds="300"
>>>>>>> is-connection-validation-required="true"
>>>>>>> is-isolation-level-guaranteed="true"
>>>>>>> lazy-connection-association="false"
>>>>>>> lazy-connection-enlistment="false" match-connections="false"
>>>>>>> max-connection-usage-count="0" max-pool-size="32"
>>>>>>> max-wait-time-in-millis="60000" name="PostgresConnectionPool"
>>>>>>> non-transactional-connections="false" pool-resize-quantity="2"
>>>>>>> res-type="javax.sql.ConnectionPoolDataSource"
>>>>>>> statement-timeout-in-seconds="-1" steady-pool-size="8"
>>>>>>> transaction-isolation-level="serializable"
>>>>>>> validate-atmost-once-period-in-seconds="0"
>>>>>>> validation-table-name="pg_type" wrap-jdbc-objects="false">
>>>>>>>
>>>>>>> <property name="Password" value="********"/>
>>>>>>>
>>>>>>> <property name="PrepareThreshold" value="0"/>
>>>>>>>
>>>>>>> <property name="ServerName" value="******"/>
>>>>>>>
>>>>>>> <property name="DatabaseName" value="*****"/>
>>>>>>>
>>>>>>> <property name="LoginTimeout" value="0"/>
>>>>>>>
>>>>>>> <property name="User" value="*********"/>
>>>>>>>
>>>>>>> <property name="PortNumber" value="*******"/>
>>>>>>>
>>>>>>> <property name="Ssl" value="true"/>
>>>>>>>
>>>>>>> <property name="sslfactory"
>>>>>>> value="org.postgresql.ssl.NonValidatingFactory"/>
>>>>>>>
>>>>>>> </jdbc-connection-pool>
>>>>>>>
>>>>>>>
>>>>>>> Thank you very much
>>>>>>>
>>>>>>> Oleg Mayevskiy
>>>>>
>>>
>