2015-10-14 12 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」 發起交易。