在池中closuresJDBC连接

我们使用JDBC的标准代码部分是…

Connection conn = getConnection(...); Statement stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); ResultSet rset = stmt.executeQuery (sqlQuery); // do stuff with rset rset.close(); stmt.close(); conn.close(); 

问题1:使用连接池时,是否应该closures连接? 如果是这样,是不是汇集失地的目的? 如果不是,那么DataSource如何知道Connection的特定实例什么时候被释放并且可以被重用呢? 我对这个有点困惑,任何赞赏的指针。

问题2:以下方法是否接近标准? 看起来像试图从池中获得连接,如果无法build立数据源,则使用旧式的DriverManager。 我们甚至不知道哪个部分在运行时被执行。 重复上面的问题,是否应该closures从这种方法出来的连接?

谢谢, – MS。

 synchronized public Connection getConnection (boolean pooledConnection) throws SQLException { if (pooledConnection) { if (ds == null) { try { Context envCtx = (Context) new InitialContext().lookup("java:comp/env"); ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat"); return ds.getConnection(); } catch (NamingException e) { e.printStackTrace(); }} return (ds == null) ? getConnection (false) : ds.getConnection(); } return DriverManager.getConnection( "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord); } 

编辑:我想我们正在得到连接池,因为我们没有看到堆栈跟踪。

在使用连接池的时候,最后应该closures连接吗? 如果是这样,是不是汇集失地的目的? 如果不是,那么DataSource如何知道Connection的特定实例什么时候被释放并且可以被重用呢? 我对这个有点困惑,任何赞赏的指针。

是的,当然你也需要closures连接池。 它实际上是一个实际连接的包装。 它将在封面下释放实际的连接回池。 进一步决定实际的连接是否将被closures,或者被重新用于新的getConnection()调用。 因此,无论您是否使用连接池,都应始终在所获取的try块的finally块中以相反顺序closures所有JDBC资源。 在Java 7中,这可以通过使用try-with-resources语句进一步简化。


以下方法是否接近标准? 看起来像试图从池中获得连接,如果无法build立数据源,则使用旧式的DriverManager。 我们甚至不知道哪个部分在运行时被执行。 重复上面的问题,是否应该closures从这种方法出来的连接?

这个例子非常可怕。 您只需在应用程序启动期间在应用程序范围的数据库configuration类的某个构造函数/初始化中查找/初始化DataSource 。 然后,在整个应用程序的整个生命周期中,只需在同一个数据源上调用getConnection() 。 不需要同步和空检查。

也可以看看:

  • 在multithreading系统中使用静态java.sql.Connection实例是否安全?
  • 我使用JDBC连接池吗?

池通常会返回一个包装的Connection对象,其中close()方法将被重写,通常会将Connection返回到池。 调用close()是可以的,可能还是需要的。

close()方法可能如下所示:

 public void close() throws SQLException { pool.returnConnection(this); } 

对于第二个问题,可以添加一个logging器来显示底部块是否运行。 我会想象,虽然你只想要一种或另一种configuration您的数据库连接。 我们只使用一个池来访问数据库。 无论哪种方式,closures连接将是非常重要的,以防止泄漏。