[ https://issues.apache.org/jira/browse/OPENEJB-1968?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13532034#comment-13532034 ]
Howard W. Smith, Jr. commented on OPENEJB-1968: ----------------------------------------------- Okay, not waiting anymore... it's taking too long to insert the 2nd airport shuttle on Windows Server 2003 32bit machine. I'm going to bring down the server and comment out the @Schedule for now...since this is production server. > @Stateless EJB with @Schedule method and single EntityManager/transaction > does not perform well and holds transaction > --------------------------------------------------------------------------------------------------------------------- > > Key: OPENEJB-1968 > URL: https://issues.apache.org/jira/browse/OPENEJB-1968 > Project: OpenEJB > Issue Type: Bug > Components: ejb31 > Affects Versions: 4.5.0 > Environment: TomEE 1.5.1 > Windows Server 2003 32bit 4GB RAM > Reporter: Howard W. Smith, Jr. > Labels: @Stateless, EJB, entitymanager, transaction > Attachments: EmailStatelessBean.java, tomcat7-stderr.2012-12-12.log > > Original Estimate: 504h > Remaining Estimate: 504h > > After implementing 'workaround' option # 1 in my previous email (below), the > test results were really really bad. :( > for 4 emails, it took 30 minutes to insert the data into the database, and > then it seemed as though the single @Stateless EJB held onto the transaction, > even after the @Schedule method, getEmails(), was done and exited. > Should I file a JIRA? I would assume that the @Stateless bean would 'let go' > of the transaction, but transaction remained opened. Maybe, I should have > issued a entityManager.flush() after completing each email, but I did flush() > a lot throughout the process. > Please note that this machine is Windows Server 2003 32bit 4GB RAM, and it > takes 10 to 15 minutes to insert data from 2 emails (which is a very small > amount of data embedded in the email). I could not select any data from > database after login. I had to shutdown TomEE. > Also, note, when I originally developed this, one @Stateless EJB with 1 > entity manager, it took 2 seconds on Windows Server 2008 64bit 16GB RAM, and > it did not hold the transaction (or database locks). also, i could select > data afterwards. > I still need to try what David mentioned, but it's been an all-nighter for > me, so i need to stop right here for now. > I think I will open a JIRA for this. > On Tue, Dec 11, 2012 at 10:10 PM, Howard W. Smith, Jr. > <smithh032...@gmail.com> wrote: > Shaking my head... test results were not good at all. > 1. @StatelessEJB EmailStatelessBean has @Schedule getEmails() > 2. @EmailStatelessBean has multiple @EJB references to @Stateless > (sessionfacade) classes that are the DAO classes > 3. EmailStatelessBean gets invoked when triggered by @Schedule > 4. EmailStatelessBean execution locks the tables, still, and locks up the > entire app, and seems to take longer...since endusers (myself) are making > requests against database (and web app). > 5. Last but not least, EmailStatelessBean failed to commit the changes; > transaction rolled back for EmailStatelessBean as well as enduser requests. > So, my workaround options include the following: > 1. EmailStatelessBean, when invoked by @Schedule method, will check the CDI > @ApplicationScoped bean (ApplicationScopeBean), and see if any endusers are > logged in; i developed a sessionInfo class that is updated everytime enduser > does a HTTP request; if any endusers are logged in, then I can use Atmosphere > (PrimeFaces Push) to push a message to the endusers, notifying them to > 'please logout, as there are customer requests pending that need to be > retrieved and inserted into the web app's database', and EmailStatelessBean > will 'return' (or exit) and not perform the operation. This way, everytime > @Schedule invokes the bean method, it will continue to check for an available > time to perform the get-emails-and-insert-into-database operation. Also, I'll > set when EmailStatelessBean begins the operation, then I'll set flag on > @ApplicationScoped bean (insertingCustomerRequestsIntoDatabase = true); this > flag will be checked when endusers attempt to login web app, and FacesMessage > will be displayed, Please login a few minutes later as system is inserting > customer requests into database. > 2. Another option would be to send a message to all clients via Atmosphere > (PrimeFaces Push), and the UI will be locked immediately, and user will be > required to wait. > Honestly, I don't like either of these approaches, but I think the endusers > will accept the 1st option (above). If I go with 1st approach, then I may > revert back to single transaction, which will complete the entire operation > much faster than multiple transactions (via multiple EJB DAO classes). > As you can see, I don't have enough experience locking database for such a > batch operation as this. I know the endusers want the customer requests to > show up into the database 'immediately', and they want to know when it > happens. Right now, this is my only option until I redesign the business > website to interface directly with the web app. right now, the web app is > 'only' used by 'personnel' (the owners of the business...which is my family). > hahaha :) > They love the app (honestly, they liked the speed and reliability of the web > app when it was on Glassfish), but I'm doing all i can to win them over with > TomEE. :) > Your thoughts, please. > Thanks, > Howard -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira