【问题标题】:Hibernate c3p0 Connection NewPooledConnection close Exception休眠 c3p0 连接 NewPooledConnection 关闭异常
【发布时间】:2013-02-13 05:53:57
【问题描述】:

我试图从我之前的帖子 java.sql.SQLRecoverableException: Closed Connection 中解决我的问题。我尝试使用 c3p0 连接。 属性如下,

<property name="hibernate.connection.provider_class">
        org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.connection.autoReconnect">true</property>
    <property name="dialect"> org.hibernate.dialect.Oracle10gDialect </property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
<property name="hibernate.c3p0.idle_test_period">6000</property>
    <property name="hibernate.c3p0.numHelperThreads">9</property>

在 JBOSS 中部署后,我开始测试我的网络。一开始它工作得很好,甚至更快。 10分钟后,它一直在加载并超时。通过 server.log 时,我收到了一些警告消息,如下所示。

00:34:13,162 INFO  [com.mchange.v2.c3p0.impl.NewPooledConnection] com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) [c3p0] Exceptions occurred while trying to close a PooledConnection's resources normally.
00:34:13,162 INFO  [com.mchange.v2.c3p0.impl.NewPooledConnection] (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) [c3p0] NewPooledConnection close Exception.: java.sql.SQLRecoverableException: IO Error: Software  caused connection abort: recv failed
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:556)   [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.PhysicalConnection.close(PhysicalConnection.java:3984) [ojdbc6.jar:11.2.0.3.0]
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:474) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:191) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) [c3p0-0.9.1.jar:0.9.1]
Caused by: java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method) [rt.jar:1.6.0_13]
at java.net.SocketInputStream.read(SocketInputStream.java:129) [rt.jar:1.6.0_13]
at oracle.net.ns.Packet.receive(Packet.java:300) [ojdbc6.jar:11.2.0.3.0]
at oracle.net.ns.DataPacket.receive(DataPacket.java:106) [ojdbc6.jar:11.2.0.3.0]
at oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315) [ojdbc6.jar:11.2.0.3.0]
at oracle.net.ns.NetInputStream.read(NetInputStream.java:260) [ojdbc6.jar:11.2.0.3.0]
at oracle.net.ns.NetInputStream.read(NetInputStream.java:185) [ojdbc6.jar:11.2.0.3.0]
at oracle.net.ns.NetInputStream.read(NetInputStream.java:102) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4C7Ocommoncall.doOLOGOFF(T4C7Ocommoncall.java:61) [ojdbc6.jar:11.2.0.3.0]
at oracle.jdbc.driver.T4CConnection.logoff(T4CConnection.java:543) [ojdbc6.jar:11.2.0.3.0]
... 6 more

00:34:13,177 WARN  [com.mchange.v2.resourcepool.BasicResourcePool] (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) Failed to destroy resource: com.mchange.v2.c3p0.impl.NewPooledConnection@b041ecc: java.sql.SQLException: Some resources failed to close properly while closing com.mchange.v2.c3p0.impl.NewPooledConnection@b041ecc
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:496) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.c3p0.impl.NewPooledConnection.close(NewPooledConnection.java:191) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.destroyResource(C3P0PooledConnectionPool.java:470) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.resourcepool.BasicResourcePool$1DestroyResourceTask.run(BasicResourcePool.java:964) [c3p0-0.9.1.jar:0.9.1]
at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) [c3p0-0.9.1.jar:0.9.1]

请给出一些想法来解决这个问题。

【问题讨论】:

    标签: hibernate jboss c3p0


    【解决方案1】:

    此问题有时会在会话关闭且用于会话的连接仍处于活动状态时引发,并且当再次打开新会话时会打开新会话。它导致连接池中指定的连接的使用超出了使用范围,并且辅助线程发挥了作用,我的问题就在这里。我更改了我的 Hibernate SessionFactory 类,并且自定义连接提供程序解决了我的问题。变化如下....

    public class HibernateSessionFactory {
    private staticString CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
    private static Configuration configuration = new Configuration();
    private static org.hibernate.SessionFactory sessionFactory;
    private static String configFile = CONFIG_FILE_LOCATION;
    public static Session session;
    static {
        try {
            configuration.configure(configFile);
            sessionFactory = configuration.buildSessionFactory();
        } catch (Exception e) {
            System.err.println("%%%% Error Creating SessionFactory %%%%");
            e.printStackTrace();
        }
    }
    
    public HibernateSessionFactory() {
    }
    public static Session getSession() throws HibernateException {
    
        try {
            if (session == null) {
                session = sessionFactory.openSession(MyConnectionProvider
                        .getConn());
            } else {
    
                if (session.isOpen() && !session.connection().isClosed()) {
    
                    System.out.println("SESSION AVAILABLE...");
    
                    MyConnectionProvider.showConnectionDetails();
    
                    return session;
                }
    
                if (!session.isOpen()) {
                    System.out.println("SESSION WAS CLOSED AND OPEN AGAIN..");
                    session = sessionFactory.openSession(MyConnectionProvider
                            .getConn());
                } else if (session.connection().isClosed()) {
    
                    System.out.println("CONNECTION WAS CLOSED AND OPENING AGAIN...");
    
                    session.close();
    
                    session = sessionFactory.openSession(MyConnectionProvider
                            .getConn());
                }
    
            }
            MyConnectionProvider.showConnectionDetails();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    
        return session;
    }
    public static org.hibernate.SessionFactory getSessionFactory() {
        return sessionFactory;
    }
    public static void setConfigFile(String configFile) {
        HibernateSessionFactory.configFile = configFile;
        sessionFactory = null;
    }
    public static Configuration getConfiguration() {
        return configuration;
    }
    
    }
    

    MyConnectionProvider 类是

    public class MyConnectionProvider {
    
    static String jdbcDriverClass;
    static String jdbcUrl;
    static String username;
    static String password;
    static String poolSize = "20";
    
    static ComboPooledDataSource ds;
    
    static {
    
        config(HibernateSessionFactory.getConfiguration().getProperties());
    
        ds = new ComboPooledDataSource();
    
        // System.out.println(" "+jdbcUrl);
    
        ds.setJdbcUrl(jdbcUrl);
    
        // System.out.println(username);
    
        ds.setUser(username);
    
        // System.out.println(password);
    
        ds.setPassword(password);
    
        ds.setMinPoolSize(1);
    
        ds.setMaxPoolSize(20);
    
    }
    
    public static void config(Properties props) {
    
        System.out.println("SETTING CONFIGURATION...");
    
        jdbcDriverClass = props.getProperty(Environment.DRIVER);
        jdbcUrl = props.getProperty(Environment.URL);
        username = props.getProperty(Environment.USER);
        password = props.getProperty(Environment.PASS);
    
        System.out.println(jdbcDriverClass + "  " + jdbcUrl + "  " + username
                + "  " + password + "  " + poolSize);
    }
    
    public static Connection getConn() {
        Connection conn = null;
        try {
            System.out.println("URL " + ds.getJdbcUrl());
            System.out.println("Busy Connections : "
                    + ds.getNumBusyConnections("user", "user"));
            return ds.getConnection();
        } catch (SQLException e) {
    
            // TODO Auto-generated catch block
            e.printStackTrace();
            return conn;
        }
    }
    
    public static void showConnectionDetails() {
    
        try {
            System.out.println("Busy Connections :  "
                    + ds.getNumBusyConnections() + " Connections : "
                    + ds.getNumConnections() + " Thread Pool Size : "
                    + ds.getThreadPoolSize() + " Active Threads : "
                    + ds.getThreadPoolNumActiveThreads() + "  Idle Threads : "
                    + ds.getThreadPoolNumIdleThreads() + "  Pending Tasks : "
                    + ds.getThreadPoolNumTasksPending());
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-05
      • 2014-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      相关资源
      最近更新 更多