Nogle forslag til fejlretning af det
-
Som Steve nævnte i kommentarerne. Prøv at se, hvad der sker, når du fjerner muligheden for unreturnedConnectionTimeout.
-
Det kan være, at dine forespørgsler tager for lang tid. Prøv at logge nogle præstationsstatistikker på din kode og se, hvor lang tid din forespørgsel tager. Måske skal du justere din forespørgsel. og på kort sigt kan du også øge unreturnedConnectionTimeout til at være mere end svartiden på dine forespørgsler.
-
Prøv også muligheden for transaktionstimeout i dvale. Kan indstilles til tx.setTimeout(20) og leg med timeout-tallene og se om nogle forespørgsler timeout.
-
Du vil måske også bruge et eller andet profileringsværktøj. Prøv VisualVM hvis din Java-version understøttes på den. Ellers (hvis på linux eller mac) kan du prøve Java-fejlfindingskommandoer på ældre version af java. Nogle af disse kommandoer er også tilgængelige fra JDK.
Små forbedringer af koden
-
Ikke sikker på, om det virkelig vil løse dit problem, men du vil måske tilføje tilbagerulning for transaktion i undtagelsesblok. Tilføjet endnu en try catch for tx.close for at undgå endnu en undtagelse.
-
Tilføjede også et nul-tjek for lukket session. Du ved måske allerede, at en betingelse, når den endelige, muligvis ikke udføres fuldstændigt - hvis en anden undtagelse kastes ind, blokerer endelig. I øjeblikket er det muligvis ikke gældende i din kode, men hvis du tilføjer mere end én linje i den endelige blok, skal du sørge for, at eventuelle undtagelser er dækket, så næste linje kan udføres.
-
Endnu et forslag er at reducere omfanget af selve transaktionen. Ser man på koden, ser det ud til, at du muligvis kun har brug for transaktionen, hvis en uid ikke er fundet. Hvad med at begrænse transaktionskoden inde i if(u==null) blok. Ikke sikker på, om det hjælper, men du behøver ikke have en transaktion til at læse.
Nedenfor er min prøvekode
public static Basicinfo getBean(Integer iduser) {
Basicinfo u = null;
Transaction tx = null;
Session sess = NewHibernateUtil.getSessionFactory().openSession();
try {
Query q = sess.createQuery("from Basicinfo where iduser=" + iduser);
u = (Basicinfo) q.uniqueResult();
if (u == null) {
tx = sess.beginTransaction(); //line 69
u = new Basicinfo();
u.setIduser(iduser);
tx.commit();
}
} catch (Exception ex) {
ex.printStackTrace();
if(tx != null) {
try {
tx.rollback();
} catch(Exception e){e.printStackTrace;}
}
} finally {
if(sess!=null) {
sess.close();
}
}
return u;
}