【问题标题】:Java Oracle JDBC Connection TimeoutJava Oracle JDBC 连接超时
【发布时间】:2014-09-24 06:46:46
【问题描述】:

我已经为我的移动应用程序使用 Servlet 开发了一些 JSON Web 服务。我正在使用(Oracle + Private Tomcat)托管。我有一个单独的类 DBOperations.java,它有很多静态函数,这些函数在 Servets 中调用以进行数据库操作。我在每个函数中使用 getConnection() 方法来获取连接对象、创建语句和执行查询。问题是一段时间后连接丢失。我正在使用以下代码重新建立连接。

public static Connection conn;
Statement stmt;

public static Connection getConnection() throws SQLException {
    if (conn == null || conn.isClosed() ) {
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            conn = DriverManager.getConnection(DB_URL, "username", "password");
            return conn;
        } catch (ClassNotFoundException | SQLException ex) {
        }
    } else {
        return conn;
    }
    return conn;
}

我无法弄清楚如何处理超时/关闭连接问题,因为上面的代码没有重新建立连接。我需要重新启动 Tomcat 以使其恢复工作状态。非常感谢任何建议或帮助。

【问题讨论】:

  • 你应该使用连接池。整个应用程序的单个静态 Connection 对象听起来可能会导致各种并发问题。
  • @Thilo 问题是一段时间内一切正常,然后如果它停止工作,重新启动服务器使其再次工作。是否应该执行任何其他验证检查来检查它是死的还是活的?
  • 您可以发出“ping”SQL(从双重中选择 *)。连接池会为您处理这个问题。
  • 服务器重启修复了这个问题,这意味着重新建立了连接。我正在尝试了解问题所在,如何在不重新启动服务器的情况下重新建立该问题?

标签: oracle servlets jdbc


【解决方案1】:

你必须使用连接池,并让 Tomcat 服务器来处理一切。创建一个 JNDI 数据源来实现相同的目标,您将永远不会遇到这样的问题。

【讨论】:

    【解决方案2】:

    使用 OraceDataSource 进行连接池,并且运行良好。

    public static OracleDataSource ods;
    
           public static Connection getConnection() throws SQLException {
                if (ods == null) {
                    ods = new OracleDataSource();
                    ods.setURL(DB_URL);
                    ods.setUser("username");
                    ods.setPassword("password");
                }
                return ods.getConnection();
            }
    

    【讨论】:

    • 你是使用关闭连接还是释放连接的方法?
    猜你喜欢
    • 1970-01-01
    • 2017-02-07
    • 2014-04-15
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 2014-09-24
    • 2014-12-12
    相关资源
    最近更新 更多