当前位置: 首页 > 知识库问答 >
问题:

如何避免JDBC连接关闭到Oracle DB(SQLRecoverableException关闭连接)?

闻法
2023-03-14

我编写了以下代码来连接到Oracle数据库。这用于REST API。我正在连接的数据库的IDLE_TIME参数设置为30分钟(这不能更改)。如果数据库连接空闲超过30分钟,则会抛出以下错误:“java.sql.SQLRecoverableException: ClosedConnection”。抛出此错误后,API将停止工作。我如何解决这个问题?

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;
import java.util.Properties;
import java.util.Queue;
import java.util.ResourceBundle;
import java.sql.SQLRecoverableException;
import oracle.jdbc.driver.*;
import oracle.jdbc.pool.*;


public class OrcConnector {

    private Queue<Connection> connections;

    private int maxConnections;

    private static final int MAX_CONNECTIONS_DEFAULT = 10;

    public OrcConnector() {

        connections = new LinkedList<Connection>();
        maxConnections = MAX_CONNECTIONS_DEFAULT ;

    }

    public synchronized int getMaxConnections(){
        return maxConnections;
    }

    public synchronized void setMaxConnection (int maxConnections) {
        this.maxConnections = maxConnections;
    }

    public synchronized ConnWrapper getConnection() throws SQLException, BusyConnections {
        Connection availConn;

        System.out.println("I am in OrcConnection");

            if (connections.size() > 0) {
                availConn = connections.poll();
            } else if (connections.size() < maxConnections) {
                Properties prop = new Properties();
                ResourceBundle resource = ResourceBundle.getBundle("database");
                String url = resource.getString("db.url");
                String user = resource.getString("db.user");
                String pass = resource.getString("db.password");
                prop.put("user", user);
                prop.put("password", pass);
                prop.put("autoReconnect", "true");
                prop.put("characterEncoding", "UTF-8");
                prop.put("useUnicode", "true");
                availConn = DriverManager.getConnection(url,user,pass);
                System.out.println("I am in OrcConnection");
            } else {
                throw new BusyConnections();
            }
            return new ConnWrapper(availConn, this);
    }

    public synchronized void putConnection(Connection conn) {
        if (conn != null) {
            if (connections.size() < maxConnections) {
                connections.add(conn);
            } else {
                try {
                    conn.close();
                } catch (SQLException e) {
                    System.out.println("connection could not be closed" + e.getMessage());
                }
            }
        }
    }


}

共有1个答案

越高峻
2023-03-14

我建议您使用UCP(通用连接池),这是Oracle的连接池,可以在这里找到,然后使用借用时验证功能。这样,当您需要连接时,您可以让UCP测试连接的有效性,如果需要,它会重新连接。

 类似资料:
  • 嗨,我只知道这是一个古老的问题,但今天只是好奇。正如我们所知connection.close也会关闭preared语句(如果我错了请纠正我)。但是如果我关闭连接然后关闭preared语句会怎样 我会得到一个空指针异常吗? 有人说这取决于jvm的速度。有时,ps.close()会在conn.close完成其工作之前运行并首先关闭,因此您不会得到null指针。 为了测试它,我修改了代码 但是我没有得到

  • 我正在使用Hibernate 3.3和Oracle 11g开发Struts 2 Framework。我的Web项目自5个月以来一直运行良好。但是最近我面临着java.sql.SQLRecoverableException:在一些空闲时间关闭连接。我将解释以下场景...我的hibernate.cfg.xml配置是 我的HibernateSessionFactory配置是 然后在运行以下代码时出错 当

  • 我使用weblogic应用服务器和oracle数据库。我使用jdbc与oracle数据库通信。我从weblogic数据源获得连接,并向表中插入一条记录。问题是,当我想关闭连接(插入数据库后)时,我会遇到一个异常(连接已经关闭)。这是我的代码: 但是联系。close语句引发异常: 我试图避免连接。close语句(因为我教过连接是自动关闭的!!但过了一段时间,所有的连接都打开了,因此引发了一个异常)

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 问题内容: 我们使用JDBC的标准代码部分是… 问题1:使用连接池时,是否应该在最后关闭连接?如果是这样,合并的目的就不会丢失吗?如果不是,那么DataSource如何知道何时释放Connection的特定实例并可以重用?我对此感到有些困惑,任何指针都表示赞赏。 问题2:以下方法是否接近标准?看起来像是尝试从池中获取连接,并且如果无法建立DataSource,请使用老式的DriverManager

  • 我有一个verticle,它使用来自事件总线的消息并对其进行处理。我有一个问题,JDBC连接应该在什么时候关闭。有两种方法 > 消息处理完毕后关闭连接。但这将是非常昂贵的,因为我将打开/关闭连接每次。 相信verticle停止/取消部署时vertx会关闭连接(实际上永远不会),并且只要连接打开,就不会有任何内存泄漏。我将在start()方法中打开连接,这样每当有消息时它就可用。 另一方面,如果我有