JDBC3.0规范规定了如下的类和接口来支持数据库连接池的实现。 

  1. javax.sql.ConnectionEvent     
  2. javax.sql.ConnectionPoolDataSource     
  3. javax.sql.PooledConnection     
  4. javax.sql.ConnectionEventListener    

规范上说PooledConnection 对象表示到数据源的物理连接. 那么执行两次PooledConnection.getConnection操作获得的逻辑连接背后的物理连接是一样的.确实如此,代码验证:

  1. import java.sql.Connection;  
  2. import java.sql.PreparedStatement;  
  3. import java.sql.SQLException;  
  4.  
  5. import oracle.jdbc.pool.OracleConnectionPoolDataSource;  
  6. import oracle.jdbc.pool.OraclePooledConnection;  
  7.  
  8. public class pooledConnection {  
  9.     static OraclePooledConnection opc;  
  10.  
  11.     public static void main(String args[]) throws SQLException,  
  12.             InterruptedException {  
  13.         OracleConnectionPoolDataSource ps = null;  
  14.         ps = new OracleConnectionPoolDataSource();  
  15.  
  16.         ps.setDatabaseName("orcl");  
  17.         ps.setServerName("localhost");  
  18.         ps.setPortNumber(1521);  
  19.         ps.setDriverType("thin");  
  20.         ps.setUser("guojje");  
  21.         ps.setPassword("guojje");  
  22.  
  23.         opc = (OraclePooledConnection) ps.getPooledConnection();  
  24.  
  25.         Connection c1 = opc.getConnection();  
  26.  
  27.         c1.setAutoCommit(false);  
  28.  
  29.         PreparedStatement p1 = c1  
  30.                 .prepareStatement("insert into test values(1)");  
  31.         p1.execute();  
  32.         //这里不提交  
  33.  
  34.         Connection c2 = opc.getConnection();  
  35.           
  36.         System.out.println(c2.equals(c1));  
  37.           
  38.         c2.setAutoCommit(false);  
  39.         PreparedStatement p2 = c2  
  40.                 .prepareStatement("insert into test values(2)");  
  41.         p2.execute();  
  42.         c2.commit();//只在这里提交  
  43.  
  44.         Thread.currentThread().sleep(1000000);  
  45.  
  46.     }  

通过查看数据库存表可以,两次操作都成功. 说明c1与c2底层物理连接是一样的.