On Fri, Apr 4, 2014 at 6:39 AM, Howard W. Smith, Jr. <smithh032...@gmail.com > wrote:
> > On Fri, Apr 4, 2014 at 5:46 AM, ivan nikitsenka <nikitse...@gmail.com>wrote: > >> >> <query> >> <description></description> >> <query-method> >> <method-name>findAll</method-name> >> <method-params></method-params> >> </query-method> >> <ejb-ql>select object(o) from BreakReason o order by >> o.reasonDesc</ejb-ql> >> </query> > > > Seriously? ORDER BY a 'reasonDesc'? > > Every now and then, I am opening jvisualvm (Java Visual VM) and profiling > (or checking the performance) on certain parts of my app, and more and > more, I am removing, > > ORDER BY ... > > from my queries, and reverting to Collections.sort() + Comparator. > > Is there an index on this 'reasonDesc'? What is 'reasonDesc'.length(), on > average? > > If this is the reason why TomEE [and your app] is degrading, then please > change your query, and remove the ORDER BY ..., and sort your data some > other way. > > Refer to your database tuning document. I use Apache Derby, and they have > a very nice/comprehensive 'Tuning Derby' guide that I have referred to in > the past, when my app went to production. > > I have seen/heard MyFaces and/or TomEE committers say/recommend that they do a lot of 'caching' to improve the performance of their app. Caching what? Caching data that can [or should] be cached. Can the result set of the following be cached in an @ApplicationScoped bean (when app starts OR on the first time that the query is needed/executed)? <ejb-ql>select object(o) from BreakReason o order by o.reasonDesc</ejb-ql> In my app, there are a few queries, where the result set is used in a dropdown (or JSF selectOneMenu). I cache the result set of those queries in @PostConstruct of my [one and only] @ApplicationScoped bean. Will TomEE [or my/your app] 'degrade' when caching such result sets? No, because TomEE [or my/your app] will not need [or refer to] a @Stateless @EJB to get this data during runtime...so many times. Also to clarify what I said earlier about removing ORDER BY ..., yes, I have some quite complex SQL, and when I profile the app (via jvisualvm), I find that Apache Derby source code is not performing well with [my] SQL and/or [my] database design, etc... So, I replace ORDER BY ... with Collections.sort() + Comparator. Also, as Jean-Louis asked/recommended, I have a [small] statement cache setting on my database <Resource .../> <Resource id="jdbc/mcmsJta" type="javax.sql.DataSource"> JdbcDriver org.apache.derby.jdbc.EmbeddedDriver JdbcUrl jdbc:derby:C:/javadb/databases/...;create=true ... jdbcInterceptors=StatementCache(max=128) </Resource> Also, I am using JPA @NamedQueries on many of the popular/most-used queries in the app, especially those that are more complex and don't [always] perform well. Also, my JPA = EclipseLink, and I use query hints, see below. public List<Driver> findAllAvailableSelectOne() { return em.createNamedQuery("Driver.findAllAvailableSelectOne") .setHint("eclipselink.query-results-cache", "true") .setHint("eclipselink.read-only", "true") .getResultList(); } where the @NamedQuery is defined as follows: @NamedQuery(name = "Driver.findAllAvailableSelectOne", query = "SELECT d FROM Driver d WHERE d.includeInLookupList = 'Y' ORDER BY d.driverName"), Interesting, I could probably cache the result set of this query in my @ApplicationScoped bean, but d.includeInLookupList can/may be changed by enduser, sometime during runtime, but enduser does not change that value unless Driver/Employee is terminated or hired. :) I may have to write some code to cache this result set in my @ApplicationScoped bean, and if enduser changes any 'Driver' in the database, then I will have to update the List<Driver> in my @ApplicationScoped bean. Hmmm, thanks for calling my attention to this query in my app. :)