2012-08-31 52 views
0

我正在開發一個小小的Java客戶端程序來通過JNDI查找從WAS連接池中檢索數據庫連接。但是這個Java客戶端位於WAS範圍之外。代碼的細節如下:通過JNDI不理解WAS連接池中的數據庫連接

import java.util.*; 
import javax.naming.*; 
import javax.naming.directory.*; 
import java.io.*; 
import java.sql.*; 
import javax.sql.*; 

public class WASORB { 

/** 
* @param args 
* @throws NamingException 
*/ 
public static void main(String[] args) throws Exception { 

    InitialContext initialContext = getInitialContext(); 

    javax.sql.DataSource ds = (DataSource)initialContext.lookup("jndi/local"); 

    Connection cn = ds.getConnection("*****", "*****"); 

    if(cn != null) 
     System.out.println ("Connection ok"); 

    String sql = "select * from ACT"; 
    Statement st = cn.createStatement(); 
    ResultSet rs = st.executeQuery(sql); 

    while(rs.next()){ 
     System.out.println (rs.getString(2)); 
    } 
} 

public static InitialContext getInitialContext() throws NamingException { 
    Hashtable env = new Hashtable(); 

env.put(Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory"); 
    env.put(Context.PROVIDER_URL,"iiop://localhost:2811"); 

    InitialContext context = new InitialContext(env); 

    return context; 
} 

}

代碼工作正常,正確返回結果。但我有兩個問題不明白這裏:

  1. 爲什麼我必須提供用戶ID /密碼調用方法的getConnection什麼時候?據我瞭解,我已經在WAS DataSource中配置了這個認證憑證。當我的java客戶端試圖獲得連接時,WAS扮演着可能的代理角色。如果是這樣,爲什麼我需要再次輸入?

  2. 一旦客戶端代碼運行,從我的角度來看,WAS特定數據庫連接池中應該有一個連接。但是我沒有看到在連接池中創建的任何連接。那麼爲什麼會發生?還是我錯誤地理解?

感謝

回答

2

認爲安全後果的,如果任何人可以簡單地通過自舉到JNDI連接到您的組織的數據庫。服務器應用程序的部署者通過將應用程序的資源引用映射到數據源的JNDI條目來證明部署在服務器上的應用程序的身份。由於不能爲任意客戶端進行此類審查,因此他們有必要進行身份驗證。

至於你的連接,它不能由服務器管理,因爲它不是來自服務器。您的連接實例正在您的客戶端運行(很可能是不同的JVM)。服務器僅管理在服務器中運行的應用程序的連接。

+0

在連接方面,如果它不能由服務器來管理,因爲它沒有來自服務器,使用JNDI查找方式的含義是什麼?在某種程度上,對於客戶端應用程序,根據您的解釋直接連接到數據庫似乎更方便和更好。對?因爲它與WAS連接池無關。 – wing2ofsky

+0

服務器和客戶端均使用JNDI。客戶端通常會使用JNDI來獲取對服務器上運行的EJB的遠程引用;不是數據源。在服務器上運行的EJB和Servlet反過來將使用JNDI來獲取返回服務器管理的數據庫連接的數據源。某些客戶端(例如HTTP客戶端)永遠不必引導到服務器的JNDI。 – pglezen

+0

感謝您的回覆@pglezen就我上面提供的程序而言,一個java客戶端試圖通過JNDI查找來獲得數據庫連接,我只想知道返回的數據庫連接是否與WAS服務器數據庫連接池有關?無論通過我的方式檢索多少個數據庫連接,它都不會佔用WAS連接池中的任何人。不是嗎? – wing2ofsky