我正在開發一個小小的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;
}
}
代碼工作正常,正確返回結果。但我有兩個問題不明白這裏:
爲什麼我必須提供用戶ID /密碼調用方法的getConnection什麼時候?據我瞭解,我已經在WAS DataSource中配置了這個認證憑證。當我的java客戶端試圖獲得連接時,WAS扮演着可能的代理角色。如果是這樣,爲什麼我需要再次輸入?
一旦客戶端代碼運行,從我的角度來看,WAS特定數據庫連接池中應該有一個連接。但是我沒有看到在連接池中創建的任何連接。那麼爲什麼會發生?還是我錯誤地理解?
感謝
在連接方面,如果它不能由服務器來管理,因爲它沒有來自服務器,使用JNDI查找方式的含義是什麼?在某種程度上,對於客戶端應用程序,根據您的解釋直接連接到數據庫似乎更方便和更好。對?因爲它與WAS連接池無關。 – wing2ofsky
服務器和客戶端均使用JNDI。客戶端通常會使用JNDI來獲取對服務器上運行的EJB的遠程引用;不是數據源。在服務器上運行的EJB和Servlet反過來將使用JNDI來獲取返回服務器管理的數據庫連接的數據源。某些客戶端(例如HTTP客戶端)永遠不必引導到服務器的JNDI。 – pglezen
感謝您的回覆@pglezen就我上面提供的程序而言,一個java客戶端試圖通過JNDI查找來獲得數據庫連接,我只想知道返回的數據庫連接是否與WAS服務器數據庫連接池有關?無論通過我的方式檢索多少個數據庫連接,它都不會佔用WAS連接池中的任何人。不是嗎? – wing2ofsky