在池中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连接将是非常重要的,以防止泄漏。