【问题标题】:No understanding with the database connection from WAS connection pool through JNDI不了解通过 JNDI 来自 WAS 连接池的数据库连接
【发布时间】:2012-08-31 01:33:09
【问题描述】:

我正在开发一个小的 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;
}

}

代码运行正常并正确返回结果。但是我这里有两个问题不明白:

  1. 为什么在调用getConnection方法时必须提供用户名/密码?据我了解,我已经在 WAS DataSource 中配置了此身份验证凭证。当我的 java 客户端尝试获取连接时,WAS 扮演了可能的代理角色。如果是这样,我为什么要在这里重新输入?

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

谢谢

【问题讨论】:

    标签: java jakarta-ee websphere websphere-7 websphere-6.1


    【解决方案1】:

    如果任何人都可以通过引导进入 JNDI 来连接到您组织的数据库,请考虑一下安全后果。服务器应用程序的部署者通过将应用程序的资源引用映射到数据源的 JNDI 条目来保证部署在服务器上的应用程序的身份。由于无法对任意客户端进行此类审查,因此必须对其进行身份验证。

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

    【讨论】:

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

    我已经在之前对您的一个问题的回答中解释了这一点:

    How to get database connection through websphere ORB call?

    【讨论】:

      猜你喜欢
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-01
      • 2011-07-15
      • 1970-01-01
      • 2014-04-09
      相关资源
      最近更新 更多