Beberapa saran untuk men-debugnya
-
Seperti yang disebutkan Steve dalam komentar. Coba lihat apa yang terjadi saat Anda menghapus opsi unreturnedConnectionTimeout.
-
Mungkin pertanyaan Anda terlalu lama. Coba catat beberapa statistik kinerja pada kode Anda dan lihat berapa lama waktu yang dibutuhkan kueri Anda. Mungkin Anda perlu menyesuaikan kueri Anda. dan untuk jangka pendek Anda juga dapat meningkatkan unreturnedConnectionTimeout menjadi lebih dari waktu respons pada kueri Anda.
-
Coba juga opsi batas waktu transaksi di hibernate. Dapat diatur tx.setTimeout(20) dan bermain dengan nomor timeout dan melihat apakah beberapa query timeout.
-
Anda mungkin juga ingin menggunakan beberapa alat pembuatan profil. Coba VisualVM jika versi Java Anda didukung di dalamnya. Jika tidak (jika di linux atau mac) Anda mungkin ingin mencoba Perintah Debug Java pada versi Java yang lebih lama. Beberapa dari perintah tersebut juga tersedia dari JDK.
Peningkatan kecil pada kode
-
Tidak yakin apakah itu benar-benar akan memperbaiki masalah Anda, tetapi Anda mungkin ingin menambahkan rollback untuk transaksi di blok pengecualian. Menambahkan try catch lain untuk tx.close untuk menghindari pengecualian lain.
-
Juga menambahkan cek nol untuk penutupan sesi. Anda mungkin sudah tahu bahwa satu kondisi ketika akhirnya mungkin tidak sepenuhnya dijalankan - jika pengecualian lain dilemparkan ke blok akhirnya. Saat ini mungkin tidak berlaku dalam kode Anda, namun jika Anda menambahkan lebih dari satu baris di blok akhirnya pastikan pengecualian apa pun tercakup sehingga baris berikutnya dapat dijalankan.
-
Satu lagi saran adalah untuk mengurangi ruang lingkup transaksi itu sendiri. Melihat kodenya, sepertinya Anda mungkin memerlukan transaksi hanya jika uid tidak ditemukan. Bagaimana dengan membatasi kode transaksi di dalam blok if(u==null). Tidak yakin apakah membantu tetapi Anda tidak perlu memiliki transaksi untuk dibaca.
Di bawah ini adalah contoh kode saya
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;
}