Một số gợi ý để gỡ lỗi nó
-
Như Steve đã đề cập trong các bình luận. Hãy thử xem điều gì sẽ xảy ra khi bạn loại bỏ tùy chọn unreturnedConnectionTimeout.
-
Có thể các truy vấn của bạn đang mất quá nhiều thời gian. Cố gắng ghi lại một số thống kê hiệu suất trên mã của bạn và xem truy vấn của bạn đang mất bao nhiêu thời gian. Có thể bạn cần điều chỉnh truy vấn của mình. và trong ngắn hạn, bạn cũng có thể tăng Thời gian chờ trả lời (unreturnedConnectionTimeout) nhiều hơn thời gian phản hồi cho các truy vấn của mình.
-
Cũng thử tùy chọn thời gian chờ giao dịch ở chế độ ngủ đông. Có thể được đặt tx.setTimeout (20) và chơi với các số thời gian chờ và xem liệu một số truy vấn có hết thời gian chờ hay không.
-
Bạn cũng có thể muốn sử dụng một số công cụ lập hồ sơ. Hãy thử VisualVM trong trường hợp phiên bản Java của bạn được hỗ trợ trên đó. Nếu không (nếu trên linux hoặc mac), bạn có thể muốn thử Lệnh gỡ lỗi Java trên phiên bản java cũ hơn. Một số lệnh đó cũng có sẵn từ JDK.
Cải tiến nhỏ về mã
-
Không chắc liệu nó có thực sự khắc phục được sự cố của bạn hay không, tuy nhiên bạn có thể muốn thêm khôi phục cho giao dịch trong khối ngoại lệ. Đã thêm một lệnh thử khác cho tx.close để tránh một ngoại lệ khác.
-
Cũng đã thêm một kiểm tra null cho đóng phiên. Bạn có thể đã biết rằng một điều kiện khi cuối cùng có thể không hoàn toàn thực thi - nếu một ngoại lệ khác được đưa vào khối cuối cùng. Hiện tại, nó có thể không được áp dụng trong mã của bạn, tuy nhiên trong trường hợp bạn thêm nhiều hơn một dòng vào khối cuối cùng, hãy đảm bảo rằng mọi trường hợp ngoại lệ đều được bảo hiểm để dòng tiếp theo có thể thực thi.
-
Một gợi ý nữa là tự giảm phạm vi giao dịch. Nhìn vào mã, có vẻ như bạn chỉ cần giao dịch trong trường hợp không tìm thấy uid. Làm thế nào về việc giới hạn mã giao dịch bên trong khối if (u ==null). Không chắc nếu giúp nhưng bạn không cần phải có giao dịch để đọc.
Dưới đây là mã mẫu của tôi
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;
}