2015-10-14 13 views
0

运行,我想了解其中JBOSS下部署Java应用程序的数据库连接池的Java应用程序池。顺便说一句,数据库连接没有问题。 数据库连接池是建立在JBOSS应用服务器象下面这样:数据库连接下JBOSS应用服务器

<datasource jta="false" jndi-name="java:/testDS" pool-name="testDS" enabled="true" use-java-context="true"> 
     <connection-url>jdbc:oracle:thin:@xxx</connection-url> 
     <driver>oracle</driver> 
     <pool> 
      <min-pool-size>2</min-pool-size> 
      <max-pool-size>15</max-pool-size> 
      <prefill>true</prefill> 
     </pool> 
     <security> 
      <user-name>admin</user-name> 
      <password>admin</password> 
     </security> 
</datasource> 

然后我的Java代码来获取连接看起来象下面这样:

String jndiName = "java:/testDS"; 
InitialContext jndiCntx = new InitialContext(); 
DataSource ds = (DataSource) jndiCntx.lookup(jndiName); 
Connection connection = ds.getConnection(); 

难道上面的代码中使用连接池的?如果是这样,下面的代码的目的是什么?我有点困惑。这两个代码片段有什么区别?

InitialContext jndiCntx = new InitialContext(); 
ConnectionPoolDataSource cpds = (ConnectionPoolDataSource) jndiCntx.lookup(jndiName);    
PooledConnection pc = cpds.getPooledConnection(); 
Connection connection = pc.getConnection(); 

回答

3

如果你看在这是由ConnectionPoolDataSource的返回的PooledConnection( http://docs.oracle.com/javase/7/docs/api/javax/sql/PooledConnection.html)的JavaDoc你可以阅读:

应用程序员不直接使用的PooledConnection界面;相反,它由管理连接池的中间层基础结构使用。

当应用程序调用该方法的DataSource.getConnection,它得到 回一个连接对象。如果正在完成连接池,则连接对象实际上是PooledConnection对象的句柄, 是物理连接。

数据源的典型用法是这样的:

@Stateless 
public class MyBean { 

    @Resource(lookup = "java:/testDS") 
    private DataSource dataSource; 

    public void testDatasource() { 
     try (Connection connection = dataSource.getConnection()) { 

      // use the connection 

     } catch (SQLException e) { 
      throw new SomeRuntimeException(e); 
     } 
    } 
} 

重要的是,使用后你的亲密的连接。最好的方法是尝试自动关闭。否则,您的服务器将无法连接。

使用 “@Statless” 发起交易。