2012-05-22 46 views
5

Tôi đã viết một ứng dụng phía máy chủ hỗ trợ trang web và nhiều ứng dụng khách di động. Tôi đã sử dụng Hibernate để truy cập dữ liệu. Sau đó tôi phát hiện ra rằng ứng dụng không thành công sau một ngày! Khi tôi kiểm tra trực tuyến, tôi phát hiện ra rằng nó là một vấn đề cũng biết với MySQL chấm dứt một kết nối "cũ" sau 8 giờ. Để tránh điều này, tôi đã tìm thấy nhiều đề xuất như bao gồm ?autoReconnect=true, sử dụng c3P0, v.v. Vì autoReconnect chính thức được khuyến khích (đặc biệt là trong môi trường sản xuất) và cũng vì nó không có tác dụng khi tôi áp dụng, tôi quyết định đi cho c3p0. Thật không may, sau khi giới thiệu cấu hình c3p0 trong tệp hibernate.cfg.xml của tôi, ứng dụng bắt đầu ném NullPointerException vào một nơi nào đó trong mã của tôi nơi tôi gọi dbSession.close() Điều này có nghĩa là HibernateUtil.getSessionFactory() thực sự trả về null. Tôi đã thêm các lọ cần thiết (c3p0-0.9.2-pre2.jar, hibernate-core-3.3.1.GA.jar, hibernate-c3p0-3.3.2.GA.jar, mchange-commons-java-0.2.1 .jar và c3p0-oracle-thin-extras-0.9.2-pre2.jar) mặc dù tôi không nghĩ rằng tất cả chúng đều được yêu cầu. Tôi đã trải qua nhiều trang đã nói về vấn đề này nhưng tôi vẫn không thể thiết lập đúng. Vui lòng giúp tôi với quy trình thực hiện từng bước dễ dàng "bắt đầu thân thiện" để thiết lập c3p0 với Hibernate. Tôi đang sử dụng Hibernate 3.3.6 trên JDK 1.6, MySQL 5.5 và tôi đang phát triển trong Netbeans 7.0.Hibernate/MySQL Connection Timeout

Đây là tôi hibernate.cfg.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> 
<hibernate-configuration> 
    <session-factory> 
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
    <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/religion_app</property> 
    <property name="hibernate.connection.username">*****</property> 
    <property name="hibernate.connection.password">*****</property> 
    <property name="hibernate.show_sql">true</property> 
    <property name="hibernate.current_session_context_class">thread</property> 
    <property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property> 

    <property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
    <property name="connection.autoReconnect">true</property> 
    <property name="connection.autoReconnectForPools">true</property> 
    <property name="connection.is-connection-validation-required">true</property> 

    <!-- configuration pool via c3p0--> 
    <property name="c3p0.acquire_increment">1</property> 
    <property name="c3p0.idle_test_period">120</property> <!-- seconds --> 
    <property name="c3p0.max_size">100</property> 
    <property name="c3p0.max_statements">0</property> 
    <property name="c3p0.min_size">10</property> 
    <property name="c3p0.timeout">180</property> <!-- seconds --> 
    <property name="c3p0.preferredTestQuery">select 1;</property> 

    <!--Mappings go here--> 
    </session-factory> 
</hibernate-configuration> 

Dưới đây là những gì tôi nhận được sau khi thêm C3P0 (không slf4j):

May 23, 2012 2:42:14 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet LoginChurch threw exception 
java.lang.NullPointerException 
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:109) 
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:138) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
    at java.lang.Thread.run(Thread.java:722) 

May 23, 2012 2:45:13 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet LoginChurch threw exception 
java.lang.ClassNotFoundException: org.slf4j.LoggerFactory 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516) 
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1361) 
    at org.hibernate.connection.C3P0ConnectionProvider.<clinit>(C3P0ConnectionProvider.java:52) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
    at java.lang.Class.newInstance0(Class.java:372) 
    at java.lang.Class.newInstance(Class.java:325) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:73) 
    at org.hibernate.connection.ConnectionProviderFactory.newConnectionProvider(ConnectionProviderFactory.java:56) 
    at org.hibernate.cfg.SettingsFactory.createConnectionProvider(SettingsFactory.java:414) 
    at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:62) 
    at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2009) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1292) 
    at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859) 
    at com.pacesolutions.religionapp.HibernateUtil.<clinit>(HibernateUtil.java:23) 
    at com.pacesolutions.religionapp.services.LoginChurch.processRequest(LoginChurch.java:68) 
    at com.pacesolutions.religionapp.services.LoginChurch.doPost(LoginChurch.java:143) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1555) 
    at java.lang.Thread.run(Thread.java:722) 


    note The full stack trace of the root cause is available in the Apache Tomcat/6.0.26 logs. 

Hầu hết các file cấu hình Hibernate của tôi, nơi được tạo ra bởi Netbeans. Tôi đã có cơ sở dữ liệu trên mặt đất sau đó tôi đã sử dụng thuật sĩ Hibernate trong Netbeans để tạo ra các tập tin cấu hình, các lớp thực thể và các tệp ánh xạ từ nó. Chúng hoạt động chính xác trước khi tôi giới thiệu c3p0 (nhưng chúng không hoạt động sau 8 giờ). Tôi sử dụng Mecurial với dự án của mình và hoàn nguyên toàn bộ dự án trở lại một thời gian trước khi tôi giới thiệu c3p0, nó hoạt động trở lại (trong 8 giờ). Ngay cả việc xóa tay tất cả các cấu hình c3p0 trong hibernate.cfg.xml làm cho ứng dụng hoạt động trở lại. Tôi có thể làm gì sai?

+0

bạn có phiền khi hiển thị cho chúng tôi ngăn xếp của NPE cũng như các mẫu làm việc của bạn với Hibernate (mẫu mã đại diện về cơ bản) không? –

Trả lời

7

Các lọ cần thiết cho cấu hình C3P0 là c3p0-0.9.2-pre2.jar & mchange-commons-java-0.2.1.jar. Ngoài ra, ngoài ra, bạn cần phải đặt c3p0.properties trong classpath.

Dưới đây là các thuộc tính cần được định cấu hình khi sử dụng C3P0 với Hibernate.

hibernate.cfg.xml

<property name="connection.provider_class"> 
       org.hibernate.connection.C3P0ConnectionProvider</property> 
<property name="hibernate.c3p0.acquire_increment">1</property> 
<property name="hibernate.c3p0.idle_test_period">100</property> 
<property name="hibernate.c3p0.max_size">100</property> 
<property name="hibernate.c3p0.max_statements">100</property> 
<property name="hibernate.c3p0.min_size">10</property> 
<property name="hibernate.c3p0.timeout">180</property> 

c3p0.properties

  • Bạn có thể xác nhận kết nối trên mỗi thanh toán c3p0.testConnectionOnCheckout=true, nhưng đây là hoạt động tốn kém.

  • Khác, bạn có thể thử lại để thiết lập kết nối theo định kỳ.

    c3p0.acquireRetryAttempts = 4
    c3p0.acquireRetryDelay = 5000

    này sẽ thử lại 4 lần với một sự chậm trễ 5 giây giữa mỗi nỗ lực liên tiếp.

+0

Cảm ơn rất nhiều. Làm ơn ở đâu 'c3p0.acquireRetryAttempts = 4'' c3p0.acquireRetryDelay = 5000' đi? –

+0

Điều này dường như không hoạt động. Tôi có thể hỏi HibernateUtil.java của tôi trông như thế nào không? –

+0

@ SayoStealth-virusOladeji Cả hai thuộc tính này được đề cập cần phải được đặt trong tệp c3p0.properties. Có lẽ, không có hiệu ứng với HibernateUtil.java, nó không bị ảnh hưởng. Bạn có thể thử hoặc 'testConnectionOnCheckout' hoặc hai thuộc tính này. –

0

Lỗi có thể được sửa bằng cách sử dụng thư viện tổng hợp thương mại như được đề xuất ở trên. Tôi đã sử dụng c3p0 chính xác theo gợi ý của @NayanWadekar. Xin lưu ý rằng c3p0 phụ thuộc vào SLF4J. Vì vậy, sau khi bao gồm các lọ c3p0 trong classpath của bạn, bạn cũng phải thêm các lọ SLF4J trong classpath của bạn. Bí quyết về vấn đề này là, nếu những cái lọ SLF4J này không có mặt, trình biên dịch vẫn sẽ không phàn nàn, bạn chỉ gặp lỗi sau khi triển khai ứng dụng. Ngoài ra, nếu bạn đang sử dụng Netbeans, hãy tránh tạo thư viện SLF4J từ tất cả các lọ được gộp lại với nhau here tại slf4.org. Lý do là một số lọ không được sử dụng cùng nhau trong cùng một dự án. Chỉ cần sử dụng hai lọ sau đây một mình từ thư viện: slf4j-api-1.6.4.jar và slf4j-jdk14-1.6.4.jar. Bạn có thể truy cập www.slf4j.org để biết chi tiết.

1

c3p0 không phụ thuộc vào SLF4J. Nếu thêm thư viện đó vào đường dẫn lớp học của bạn đã khắc phục sự cố của bạn, điều đó thật thú vị nhưng không dễ giải thích.

Dấu vết ngăn xếp của bản ghi nhớ NPE gốc được ghi lại khi bạn gặp sự cố sẽ hữu ích. (Tôi là nhà phát triển của c3p0.)

Lưu ý rằng c3p0.properties cần phải ở cấp cao nhất của CLASSPATH của ứng dụng, có thể không phải là nơi đặt các tệp cấu hình khác. c3p0.properties được tải dưới dạng tài nguyên ClassLoader.

+0

Tôi đã chỉnh sửa bài đăng để bao gồm một số nhật ký. –