【问题标题】:Issue with Tomcat pooling with Hibernate. MySQL timeoutTomcat 池与 Hibernate 的问题。 MySQL 超时
【发布时间】:2013-03-03 16:21:35
【问题描述】:

我一直在使用 MySQL 在tomcat7 上开发一个带有hibernate3 的struts web 应用程序。起初我一直在使用 c3p0 池...然后我切换到 tomcat 池。但是一天后我得到了同样的错误。每天早上我们都要重启服务器。

日志显示java.lang.NullPointerException这样

sm.Login.execute(Login.java:24)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
java.lang.reflect.Method.invoke(Unknown Source)
com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452) 
com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:133)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:243)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
interceptors.SessionCheck.intercept(SessionCheck.java:47)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
interceptors.LoginInterceptor.intercept(LoginInterceptor.java:43)
com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)

我的 META-INF/context.xml 在这里,

<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/sealmanagement">

        RemoveAbandoned="true" 

        maxAllowed="150" 
        maxIdle="15" 

        name="jdbc/stockdb" 

        type="javax.sql.DataSource" 
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 

    url="jdbc:mysql://localhost:3306/stockdb?autoReconnect=true"
    driverClassName="com.mysql.jdbc.Driver"
    username="root"
    password="1234"
    jmxEnabled="true"
    testWhileIdle="true"
    testOnBorrow="true"
    validationQuery="SELECT 1"
    testOnReturn="true"
    validationInterval="3000"
    timeBetweenEvictionRunsMillis="30000"
    maxActive="100"
    initialSize="10"
    maxWait="1000"
    minEvictableIdleTimeMillis="30000"
    minIdle="10"
    logAbandoned="true"

jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer"

        />


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>


   <!-- using container-managed JNDI -->
<property name="hibernate.connection.datasource">
java:comp/env/jdbc/stockdb
</property>
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>       


<property name="hibernate.current_session_context_class">org.hibernate.context.ThreadLocalSessionContext</property>

 package dbcon;


import org.hibernate.cfg.AnnotationConfiguration;

import org.hibernate.SessionFactory;

/**
 * Hibernate Utility class with a convenient method to get Session Factory object.
 *
 * 
 */
public class HibernateUtil {
    private static final SessionFactory sessionFactory;

    static {
        try {
            // Create the SessionFactory from standard (hibernate.cfg.xml) 
            // config file.
            sessionFactory = new AnnotationConfiguration().configure().buildSessionFactory();
        } catch (Throwable ex) {
            // Log the exception. 
            System.err.println("Initial SessionFactory creation failed." + ex);
            throw new ExceptionInInitializerError(ex);
        }
    }

    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

尽管它不影响事件,但我也将 PoolProperties 类放入 java 代码中。可能是问题...

这里是 Getdbcon.java

package dbcon;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.apache.tomcat.jdbc.pool.PoolProperties;

public class Getdbcon {
    //get mysql connection // -- shehan
    public Connection getmysqlConnection() throws SQLException {

        PoolProperties p = new PoolProperties();
        p.setUrl("jdbc:mysql://localhost:3306/stockdb?auto_reconnect=true");
        p.setDriverClassName("com.mysql.jdbc.Driver");
        p.setUsername("root");
        p.setPassword("1234");
        p.setJmxEnabled(true);
        p.setTestWhileIdle(true);
        p.setTestOnBorrow(true);
        p.setValidationQuery("SELECT * from userlogin where 1 limit 1");
        p.setTestOnReturn(true);
        p.setValidationInterval(30000);
        p.setTimeBetweenEvictionRunsMillis(30000);
        p.setMaxActive(100);
        p.setInitialSize(2);
        p.setMaxWait(10000);
        p.setMinEvictableIdleTimeMillis(30000);
        p.setMinIdle(10);
        p.setLogAbandoned(true);
        p.setRemoveAbandoned(false);

 p.setJdbcInterceptors("org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
        DataSource datasource = new DataSource();
        datasource.setPoolProperties(p); 

        Connection con = null;
        try{
        con = datasource.getConnection();
        }
        catch(Exception e){

            e.printStackTrace();

        }
        return con;



    }

这里有一些来自 tomcat 启动日志控制台的行......认为它们很有用

INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.6 ( Revision: ${svn.Revision} )
Mar 15, 2013 9:00:08 AM org.hibernate.dialect.Dialect <init>
INFO: Using dialect: org.hibernate.dialect.MySQLDialect
Mar 15, 2013 9:00:08 AM org.hibernate.transaction.TransactionFactoryFactory buildTransactionFactory
INFO: Using default transaction strategy (direct JDBC transactions)
Mar 15, 2013 9:00:08 AM org.hibernate.transaction.TransactionManagerLookupFactory getTransactionManagerLookup
INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
Mar 15, 2013 9:00:08 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic flush during beforeCompletion(): disabled
Mar 15, 2013 9:00:08 AM org.hibernate.cfg.SettingsFactory buildSettings
INFO: Automatic session close at end of transaction: disabled

请注意这一点。非常感谢您。

【问题讨论】:

  • 嗨,我已经添加了 HibernateUtil.java 和 Getdbcon.java 文件。请看一看....

标签: java mysql hibernate tomcat struts


【解决方案1】:

autoReconnect=true 不推荐,justification lies here

通常,您不应该在 hibernate 中自己建立 JDBC 连接。 Hibernate Session object 有一个 createQuery 和 createSQLQuery 方法,这使得大多数 JDBC 代码变得多余。我说大多数是因为我还没有想出在 Hibernate 中执行VACUUM ANALYZE 的方法,所以我必须建立一个单独的 JDBC 连接才能这样做,但除非出现这样的边缘情况,你真的不应该混合使用 JDBC 和 Hibernate。

【讨论】:

  • 不...您不应该在使用 Hibernate 时编写 JDBC 代码。毕竟,Hibernate 是基于 JDBC 构建的。
  • 是的,我明白了。那么我应该如何启动连接呢?没有 Getdbcon.java 可以吗?
  • 加入Dnews on freenode,我会帮你的。看来你不能在这里聊天,除非你有 20 声望。
  • 感谢 hd1...您帮了大忙...谢谢...我会根据您的建议走得更远...再见
  • 最后我删除了所有的池系统,只检查了 hibernate3。但问题是一样的。 stacktrace 建议添加 autoReconnect=true 选项。我也试过了。没有成功。
【解决方案2】:

然后我在 my.ini 的末尾添加了 wait_timeout 变量。 并赋予它最大值。 according to this

然后一切都解决了。这个问题不再困扰我了。

感谢hd1 的帮助。

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 2012-06-12
    • 2012-01-13
    • 2010-10-25
    • 2017-12-01
    • 2013-10-10
    • 2011-02-14
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多