我正在开发一个小的Java客户端程序,通过JNDI查找从WAS连接池检索数据库连接。但是这个java客户端位于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;
}
}
代码工作正常并正确返回结果。但我有两个问题在这里不明白:
为什么我在调用 getConnection 方法时必须提供用户名/密码?根据我的理解,我已经在WAS DataSource中配置了此身份验证凭据。当我的java客户端尝试获取连接时,WAS扮演可能的代理角色。如果是这样,为什么我需要在这里再次输入?
客户端代码运行后,从我的角度来看,WAS特定数据库连接池中应该有一个连接。但我没有在连接池中看到任何连接。那么为什么会这样呢?还是我错误地理解了?
谢谢
答案 0 :(得分:2)
如果有人可以通过引导到JNDI连接到您组织的数据库,请考虑安全性后果。服务器应用程序的部署者通过将应用程序的资源引用映射到数据源的JNDI条目来担保部署在服务器上的应用程序的标识。由于不能对任意客户进行此类审查,因此有必要进行身份验证。
至于您的连接,它不能由服务器管理,因为它不是来自服务器。您的连接实例正在您的客户端中运行(很可能是另一个JVM)。服务器仅管理服务器中运行的应用程序的连接。
答案 1 :(得分:0)
我已经在之前对你的一个问题的回答中解释过: