2013-05-28 34 views
5

Tôi đang sử dụng oracle 11g, hibernate 3 và jsf2.I đã triển khai ứng dụng của tôi trên was7.Every đang hoạt động tốt nhưng khi tôi cố gắng đăng nhập sau 5-6 giờ nó mang lại cho tôi lỗijava.sql.SQLException: Io ngoại lệ: Kết nối thiết lập lại bởi peer: socket write error

ERROR org.hibernate.util.JDBCExceptionReporter - Io exception: Connection reset by peer: socket write error 
[5/28/13 11:31:25:048 IST] 00000024 SystemErr  R org.hibernate.exception.GenericJDBCException: could not execute query 
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:126) 
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:114) 
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) 
    at org.hibernate.loader.Loader.doList(Loader.java:2231) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2125) 
    at org.hibernate.loader.Loader.list(Loader.java:2120) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:401) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:361) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1148) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102) 

Tôi không thể tìm ra cách lỗi này để giải quyết.Vui lòng giúp tôi.Cảm ơn trước.

Bây giờ tôi đã giải quyết vấn đề này bằng mã nhưng tôi không biết là nó đúng cách hay không. Bạn đề nghị tôi, tôi nên tiếp tục với giải pháp này trên không.

public class ApplicationUtilityBean implements Serializable { 
private SessionFactory sessionFactory; 
private AnnotationConfiguration cfg; 
public String filePath; 
private String realPath = Config.PATH; 

public ApplicationUtilityBean() throws URISyntaxException { 
    getConnection(); 
} 

public void getConnection() { 
    URL r = this.getClass().getClassLoader().getResource("hibernate.cfg.xml"); 
      cfg = new AnnotationConfiguration(); 
    cfg.configure(r); 
    String pwd = cfg.getProperty("hibernate.connection.password"); 
    TripleDESEncryption tripledesenc = null; 
    try { 
     tripledesenc = new TripleDESEncryption(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    cfg.setProperty("hibernate.connection.password", 
      tripledesenc.decrypt(pwd)); 
    sessionFactory = cfg.buildSessionFactory(); 

    System.out.println("cfg: " + cfg); 
    System.out.println("sessionFactory: " + sessionFactory); 
} 

public Session getSession() { 
    System.out.println("Going to get session"); 
    Session session = null; 
    try { 
     System.out.println("cfg is: " + cfg); 
     System.out.println("sessionFactory: " + sessionFactory); 
     session = sessionFactory.openSession(); 
     if(session != null){ 
      try { 
       Transaction trxn = session.beginTransaction(); 
       Query queryResult = session.createSQLQuery("select * from dual"); 
       List<GTS_USER>listgtsuser = queryResult.list();  
           } catch (Exception e) {     
       e.printStackTrace(); 
       System.out.println("Creating new connection............"); 
       session.close(); 
       sessionFactory.close(); 
       getConnection(); 
       session = sessionFactory.openSession(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return session; 
} 

}

và tập tin cấu hình Hibernate của tôi là

<hibernate-configuration> 
<session-factory> 

    <property name="hibernate.cache.region.factory_class">net.sf.ehcache.hibernate.EhCacheRegionFactory</property> 
    <property name="hibernate.cache.use_query_cache">true</property> 
    <property name="hibernate.cache.use_second_level_cache">true</property> 

    <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property> 
    <property name="hibernate.connection.url">jdbc:oracle:thin:@xxxxxxxxx:1521:HMS</property> 
    <property name="hibernate.connection.username">xxxxx</property> 
    <property name="hibernate.connection.password">xxxxxxxxxxx</property> 
    <property name="hibernate.connection.pool_size">10</property> 
    <property name="show_sql">true</property> 
    <property name="dialect">org.hibernate.dialect.OracleDialect</property> 
    <property name="hibernate.hbm2ddl.auto">update</property> 
+0

Bạn có chỉ định tham số cơ sở dữ liệu trong tệp cấu hình ngủ đông hoặc bạn đang sử dụng nguồn dữ liệu được định nghĩa trong was7 và tra cứu bằng JNDI? – gkamal

+0

chỉ định thông số db trong cấu hình ngủ đông chỉ – RaviPancholi

Trả lời

4

Có thể bạn đang phải đối mặt với thời gian chờ kết nối cơ sở dữ liệu. Trên mọi cơ sở dữ liệu có thời gian chờ khi kết nối được mở và không có hoạt động nào trong một khoảng thời gian nhất định. Bạn cần một người quản lý hồ bơi kết nối.

Nếu bạn cài đặt c3p0 và định cấu hình chính xác, nó sẽ cho phép ngủ đông giữ cho kết nối của bạn luôn hoạt động và/hoặc mở lại khi bạn cần.

Dưới đây là example cho MySQL và Hibernate thực sự nhưng cũng giống nhau. Bạn cần phải bao gồm c3p0.jar và cũng thêm video này vào tập tin cấu hình hibernade của bạn:

<property name="c3p0.min_size">5</property> 
<property name="c3p0.max_size">20</property> 
<property name="c3p0.timeout">1800</property> 
<property name="c3p0.max_statements">50</property> 
<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

Hãy chắc chắn để cấu hình c3p0.timeout theo cơ sở dữ liệu của bạn!

+0

Tôi đã thử như cũ nhưng không hoạt động. Có bất kỳ thay đổi mức mã nào không? – RaviPancholi

+0

Rất tiếc, đã xảy ra lỗi, thao tác này sẽ hoạt động ngay bây giờ! –

+0

Bây giờ tôi đã thử nghiệm nó đang làm việc tốt. Cảm ơn bạn đã giúp đỡ của tôi. – RaviPancholi

0

Vấn đề ở đây là một kết nối nhàn rỗi sẽ được đóng bởi các máy chủ cơ sở dữ liệu. Ứng dụng không đến để biết về nó và cố gắng sử dụng một kết nối cũ (từ các hồ bơi đã được tạo ra trong quá trình khởi tạo). Việc sửa lỗi cho điều này là cấu hình pool kết nối để thực hiện kiểm tra cho liveness (thường là bằng cách kích hoạt một truy vấn chọn đơn giản) trước khi sử dụng kết nối từ pool.

Cách thực hiện việc này thay đổi theo cách bạn đã thiết lập nhóm nguồn dữ liệu/kết nối. Nếu bạn cung cấp thêm chi tiết về nó, tôi có thể cung cấp hướng dẫn cụ thể hơn.

+0

Tôi chỉ đang sử dụng kết nối defoult pooling của hibernate 3.I đã đặt proprty trong hibernate.cfg.xml. – RaviPancholi

1

Theo @BalusC

Nếu ứng dụng của bạn có nghĩa vụ phải chạy một thời gian tương đối dài và để kết nối DB khá thường xuyên, sau đó xem xét sử dụng một hồ bơi kết nối để cải thiện hiệu suất kết nối. Nếu ứng dụng của bạn là một ứng dụng web, sau đó hãy xem trong tài liệu của máy chủ ứng dụng, nó thường cung cấp một cơ sở kết nối tổng hợp trong hương vị của một DataSource. Nếu nó là một ứng dụng khách, sau đó tìm kiếm các thư viện kết nối bên thứ ba đã chứng minh sức mạnh của chúng trong nhiều năm, chẳng hạn như Apache Commons DBCP (thường được sử dụng, được sử dụng trong nhiều trình ứng dụng), C3P0 (được biết đến từ Hibernate) và Proxool (nếu bạn muốn) Kết nối XA).

Các vấn đề liên quan