【问题标题】:Websphere Network deployment datasourceWebsphere 网络部署数据源
【发布时间】:2013-10-04 07:00:17
【问题描述】:

我已经安装了 Websphere Network 部署服务器 7.0.0.0 我已经在上面配置了一个集群。 我在上面配置了一个数据源,说 ORA_DS 这个数据源使用“JAAS - J2C 身份验证数据” 当我通过单击“测试连接”按钮测试 ORA_DS 时,测试连接成功。

当我尝试使用我的 java 代码访问此数据源时出现问题。

这是我访问数据源并创建连接的代码:

public class DSTester
{
    /**
     * Return the data source.
     * @return the data source
     */
    private DataSource getDataSource()
    {
        DataSource dataSource = null;

        Hashtable<String, String> env = new Hashtable<String, String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.ibm.websphere.naming.WsnInitialContextFactory");
        env.put(Context.PROVIDER_URL, "iiop://localhost:9811");

        // Retrieve datasource name
        String dataSourceName = "EPLA1";
        if (dataSource == null)
        {
            try
            {
                Context initialContext = new InitialContext(env);
                dataSource = (DataSource) initialContext.lookup(dataSourceName);
            }
            catch (NamingException e1)
            {
                e1.printStackTrace();
                return null;
            }
        }

        return dataSource;
    }

    public static void main(String[] args)
        throws Exception
    {
        DSTester dsTester = new DSTester();
        DataSource ds = dsTester.getDataSource();
        System.out.println(ds);
        System.out.println(ds.getConnection());
    }
}

这是输出:

    com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource@17e40be6
Exception in thread "P=792041:O=0:CT" java.sql.SQLException: ORA-01017: invalid username/password; logon denied
DSRA0010E: SQL State = 72000, Error Code = 1,017
    at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
    at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:133)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:206)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:455)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:406)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:399)
    at oracle.jdbc.driver.T4CTTIoauthenticate.receiveOauth(T4CTTIoauthenticate.java:799)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:368)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:508)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:203)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:33)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:510)
    at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:275)
    at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:206)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPhysicalConnection(OracleConnectionPoolDataSource.java:139)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:88)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:70)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper$1.run(InternalGenericDataStoreHelper.java:1175)
    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper.getPooledConnection(InternalGenericDataStoreHelper.java:1212)
    at com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:2019)
    at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:1422)
    at com.ibm.ws.rsadapter.spi.WSDefaultConnectionManagerImpl.allocateConnection(WSDefaultConnectionManagerImpl.java:81)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:646)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:613)
    at com.test.DSTester.main(DSTester.java:70)

如果我替换代码可以正常工作

ds.getConnection()

ds.getConnection("ora_user", "ora_password")

我的问题是我需要在不指定 Oracle 登录详细信息的情况下获取连接。

请帮助我解决这个问题。 任何线索将不胜感激。 谢谢

【问题讨论】:

    标签: java jakarta-ee websphere jndi


    【解决方案1】:

    我猜如果您从运行在 WAS 上的应用程序检索数据源,它会起作用。

    尝试创建一个 servlet。

    Context initialContext = new InitialContext();
    DataSource dataSource = (DataSource) initialContext.lookup("EPLA1");
    Connection con = dataSource.getConnection();
    

    作为在 servlet 中运行,它在 WAS 中运行应该没问题,如果“测试连接”有效。在外面运行它可能是一个不同的上下文。

    【讨论】:

    • 我尝试从 EJB 访问数据源,但没有成功。所以最后我决定在 getConnection() 中提供用户名和密码,但仍在等待解决方案。
    【解决方案2】:

    我认为您需要检查所有配置: 1) 应用程序是部署在集群上还是仅部署到集群成员之一? 2) JAAS - J2C 认证数据 - 范围是什么?

    有时您需要重新启动所有 WAS 环境。取决于资源配置范围

    我建议您添加资源引用以获得更好的配置选项。 见IBM Tech note

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多