Java 不了解通过JNDI从WAS连接池进行的数据库连接

Java 不了解通过JNDI从WAS连接池进行的数据库连接,java,jakarta-ee,websphere,websphere-7,websphere-6.1,Java,Jakarta Ee,Websphere,Websphere 7,Websphere 6.1,我正在开发一个小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 *

我正在开发一个小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时必须提供用户ID/密码?据我所知,我已经在WAS数据源中配置了此身份验证凭据。当我的java客户端尝试获取连接时,WAS可能扮演代理角色。如果是,为什么我需要在这里再次输入

  • 在我看来,一旦客户机代码开始运行,WAS特定的数据库连接池中就应该有一个连接。但我没有看到在连接池中创建任何连接。那么为什么会发生这种情况呢?还是我理解错了


  • 谢谢

    想一想,如果任何人只需引导到JNDI,就可以连接到您组织的数据库,那么会带来什么样的安全后果呢。服务器应用程序的部署者通过将应用程序的资源引用映射到数据源的JNDI条目来证明部署在服务器上的应用程序的身份。由于无法对任意客户端进行此类审查,因此有必要对其进行身份验证


    至于您的连接,它不能由服务器管理,因为它不是来自服务器。您的连接实例正在客户端(很可能是另一个JVM)中运行。服务器只管理服务器上运行的应用程序的连接。

    我在前面回答您的一个问题时已经解释过:


    在连接方面,如果由于它不是来自服务器而无法由服务器管理,那么使用JNDI查找方式的意义是什么?在某种程度上,对于客户端应用程序,根据您的解释,直接连接到数据库似乎更方便、更好。对吗?因为它与WAS连接池无关。JNDI存在,可供服务器和客户端使用。客户端通常会使用JNDI获取对服务器上运行的EJB的远程引用;不是数据源。服务器上运行的EJB和servlet反过来将使用JNDI获取返回服务器管理的数据库连接的数据源。一些客户端,例如HTTP客户端,不必引导到服务器的JNDI。感谢您的回复@pglezen,就我上面提供的程序而言,java客户端试图通过JNDI查找获得数据库连接,我只是想知道返回的数据库连接是否与WAS服务器数据库连接池有关?无论通过my way检索多少个db连接,它都不会占用WAS连接池中的任何人。是吗?没错。您在客户端中接收的连接对象不是来自WAS连接池(仅存在于服务器上)。连接的信息是从JNDI检索的,就像在服务器上一样。但是连接对象是在客户端中实例化的。他永远也不会知道,也无法管理。这种做法通常是避免的,因为它有可能使数据库中充斥着来自多个客户端的并发连接。如果数据库连接被限制为来自服务器,则可以更好地控制它们。