当前位置: 首页 > 面试题库 >

Java / JDBC:发生异常时关闭数据库连接的最佳设计模式

谯德元
2023-03-14
问题内容

我是Java的新手(我正在使用Java 6)。我一直在对所有Java POJO和servlet使用以下设计模式,以通过GlassFish 3.1.2
Web服务器访问Oracle 11G数据库。

耗尽所有可用进程(或会话,不确定是什么区别)后,我遇到间歇性数据库错误(ORA-12519),这使我开始思考应用程序未在释放进程。

查看下面的设计模式,是否有更好的方法来确保在发生异常时释放与数据库的JDBC连接?例如,是否还应该将if ( conn != null) conn.close();代码放在catch块内?还是有更好的设计模式?在此先感谢您的任何评论/提示。

public String MyFunction() throws Exception {

    Connection conn;
    CallableStatement cs;

  try {

      Context context = new InitialContext();
      DataSource ds = (DataSource)context.lookup("jdbc/MyPool");
      conn = ds.getConnection();

      cs = conn.prepareCall( "{call my_sproc (?)}" );

      cs.registerOutParameter(1, Types.VARCHAR);

      cs.execute();

      String outParam = cs.getString(1);

      if ( conn != null )  // close connection
         conn.close();

  } catch (Exception e) {
      outParam = "an error occurred";
  }
    return outparam;
}

问题答案:
if ( conn != null )  // close connection
         conn.close();

在此行conn 不能 为null。直到Java 6为止,最受欢迎的模式是:

Connection conn = null;
try {
   // initialize connection
   // use connection 
} catch {
  // handle exception
} finally {
  if (conn != null) {
     try { conn.close(); } catch (Exception e) { /* handle close exception, quite usually ignore */ } 
     }
}

使用 Java 7 ,它的try-with-
resource
结构将变得不那么麻烦。上面的代码可以更改为更短

try (Connection conn  = createConnection()) {
    // use connection 
} catch {
    // handle exception
}
// close is not required to be called explicitly


 类似资料:
  • 问题内容: 我有些困惑,我从阅读以下内容 你不需要关闭conn连接吗?如果conn.close()没有发生,那实际上是怎么回事? 我有一个正在维护的私有Web应用程序,该应用程序当前无法关闭任何一种形式,但是重要的应用程序真的是stmt,conn还是两者兼而有之? 该站点间歇性地关闭,但是服务器一直在说这是数据库连接问题,我怀疑它没有关闭,但是我不知道该关闭哪个。 问题答案: 使用完之后,你需要通

  • 这是类的构造函数之一。新对象在数据库中创建新记录。当我在源代码中“手工”创建这个对象时,一切都很好。但是当我将创建声明放入按钮的actionlistener中时,编译器返回sql异常。 我得到的例外是

  • 主要内容:1. 导入JDBC包,2. 注册JDBC驱动程序,数据库URL配置,创建连接对象,使用具有用户名和密码的数据库URL,关闭JDBC连接安装相应的驱动程序后,现在是时候来学习使用JDBC建立数据库连接了。 建立JDBC连接所涉及的编程相当简单。 以下是基本的四个步骤 - 导入JDBC包:使用Java语言的语句在Java代码开头位置导入所需的类。 注册JDBC驱动程序:使JVM将所需的驱动程序实现加载到内存中,从而可以满足JDBC请求。 数据库URL配置:创建一个正确格式化的地址,指向要连

  • 简而言之,在60秒不活动后,我得到了极好的堆栈跟踪(org.apache.tomcat.jdbc.pool.ConnectionPool放弃),这是几个服务器端线程的正常行为。 我直接使用Tomcat JDBC连接池(org.apache.tomcat.jdbc.pool.DataSource) 堆栈跟踪: 我的池属性配置如下: 我希望setValidationInterval(30000)能救我

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

  • 我正在使用sql server 2008。我需要检查是否可以使用服务器名称、端口号、数据库名称、用户名和密码建立连接。 有没有简单的方法可用?