Background: I’m writing a little desktop application with connection to existing SQL Server DB.
I’m quite familiar with writing SQL queries but this time I want to give JPA a shot. I have my entities mapped and everything is fine, but I’m little worried about perfomance.
I made some profiling and the result is that the JPA code is not really slower than mapping by hands. But there is a still one problem that is bugging me.
I’ve recorded the queries with SQL Server Profiler and Eclipse link is constantly calling exec sp_prepexec and exec sp_unprepare with the same query but diffent parameters.
I’ve rewriten the code to use parameters in query, but still no luck.
The class code is:
In constructor I create EntityManagerFactory and EntityManager
emf = Persistence.createEntityManagerFactory("ZapytaniaOKonta_1.0");
em = emf.createEntityManager();
query=prepareQuery();
In prepareQuery I prepare the query using criteria builder and parameters
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Uczestnik> criteria = builder.createQuery(Uczestnik.class);
Root<Uczestnik> uczestnikRoot = criteria.from(Uczestnik.class);
criteria.select(uczestnikRoot);
ParameterExpression<Boolean> peselFilterParameter = builder.parameter(Boolean.class, "peselFilterParameter");
ParameterExpression<String> peselParameter = builder.parameter(String.class, "peselParameter");
Predicate peselPredicate = orBuilder(builder, uczestnikRoot, peselParameter, peselFilterParameter, Uczestnik_.pesel);
ParameterExpression<Boolean> nipFilterParameter = builder.parameter(Boolean.class, "nipFilterParameter");
ParameterExpression<String> nipParameter = builder.parameter(String.class, "nipParameter");
Predicate nipPredicate = orBuilderNip(builder, uczestnikRoot, nipParameter, nipFilterParameter, Uczestnik_.nip);
ParameterExpression<Boolean> regonFilterParameter = builder.parameter(Boolean.class, "regonFilterParameter");
ParameterExpression<String> regonParameter = builder.parameter(String.class, "regonParameter");
Predicate regonPredicate = orBuilder(builder, uczestnikRoot, regonParameter, regonFilterParameter, Uczestnik_.regon);
criteria.where(builder.and(peselPredicate, nipPredicate, regonPredicate));
uczestnikPeselRegonNipQuery = em.createQuery(criteria);
return uczestnikPeselRegonNipQuery;
when using the query I set all the parameters and call
query.getResultList();
So my question is how can I make EclipseLink or other JPA2 provider use prepared statements?
EclipseLink does not use a statement cache by default. To enable one use,
“eclipselink.jdbc.cache-statements”=”true”
This can only be used with EclipseLink’s connection pooling. When using a JavaEE DataSource, you need to enable statement caching in your JavaEE server’s DataSource config.