Java 调用DataSource.getConnection未返回预期的连接

Java 调用DataSource.getConnection未返回预期的连接,java,database,jdbc,jakarta-ee,websphere,Java,Database,Jdbc,Jakarta Ee,Websphere,我有以下代码: Hashtable env1 = new Hashtable(); env1.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory"); log.info("Executed step 1"); env1.put(javax.naming.Context.PROVIDER

我有以下代码:

        Hashtable env1 = new Hashtable();

        env1.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY,"com.ibm.websphere.naming.WsnInitialContextFactory");
        log.info("Executed step 1");
        env1.put(javax.naming.Context.PROVIDER_URL, "iiop://myhost.com:9301");
        log.info("Executed step 2");    

        Context ctx = new InitialContext(env1);

        DataSource ds = (DataSource)ctx.lookup("jdbc/mydatasource");
        log.info("Excecuted lookup  ="+ds);

        conn = ds.getConnection();
为了从数据源检索连接,我在连接到WAS 6.1.0.3的独立应用程序中有前面的代码。代码非常严格,我已经看到相同的代码在不同的环境中工作,但是在本例中,当我调用getConnection时,我得到一个异常。数据源设置了正确的身份验证别名,当测试连接时,它在WAS端正常工作,但前面的代码不起作用

如果我更改此行:conn=ds.getConnection()

对此:conn=ds.getConnection(“用户名”、“密码”)

那么代码就可以工作了!但这不是我想要的,因为数据源中的连接应该已经设置了凭据。我最初认为这是Sybase的问题,但Oracle也有这种情况,所以我宁愿说我对was有问题

如果您对例外情况感到好奇,对于Sybase,我得到:

java.sql.SQLException: JZ004: User name property missing in DriverManager.getConnection(..., Properties).DSRA0010E: SQL State = JZ004, Error Code = 0
    at com.sybase.jdbc2.jdbc.ErrorMessage.raiseError(ErrorMessage.java:569)
    at com.sybase.jdbc2.tds.LoginToken.<init>(LoginToken.java:128)
    at com.sybase.jdbc2.tds.Tds.doLogin(Tds.java:506)
    at com.sybase.jdbc2.tds.Tds.login(Tds.java:449)
    at com.sybase.jdbc2.jdbc.SybConnection.tryLogin(SybConnection.java:254)
    at com.sybase.jdbc2.jdbc.SybConnection.regularConnect(SybConnection.java:230)
    at com.sybase.jdbc2.jdbc.SybConnection.<init>(SybConnection.java:200)
    at com.sybase.jdbc2.jdbc.SybPooledConnection.<init>(SybPooledConnection.java:72)
    at com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource.createConnection(SybConnectionPoolDataSource.java:138)
    at com.sybase.jdbc2.jdbc.SybDriver.connect(SybDriver.java:485)
    at com.sybase.jdbc2.jdbc.SybDriver.connect(SybDriver.java:517)
    at com.sybase.jdbc2.jdbc.SybDataSource.getConnection(SybDataSource.java:227)
    at com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource.getPooledConnection(SybConnectionPoolDataSource.java:74)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper$1.run(InternalGenericDataStoreHelper.java:897)
    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper.getPooledConnection(InternalGenericDataStoreHelper.java:892)
    at com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:1181)
    at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:1047)
    at com.ibm.ws.rsadapter.spi.WSDefaultConnectionManagerImpl.allocateConnection(WSDefaultConnectionManagerImpl.java:81)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:431)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:400)
java.sql.SQLException:JZ004:DriverManager.getConnection(…,Properties)中缺少用户名属性。DSRA0010E:sql State=JZ004,错误代码=0
位于com.sybase.jdbc2.jdbc.ErrorMessage.raiseError(ErrorMessage.java:569)
位于com.sybase.jdbc2.tds.LoginToken。(LoginToken.java:128)
位于com.sybase.jdbc2.tds.tds.doLogin(tds.java:506)
登录com.sybase.jdbc2.tds.tds.login(tds.java:449)
位于com.sybase.jdbc2.jdbc.SybConnection.tryLogin(SybConnection.java:254)
位于com.sybase.jdbc2.jdbc.SybConnection.regularConnect(SybConnection.java:230)
位于com.sybase.jdbc2.jdbc.SybConnection。(SybConnection.java:200)
位于com.sybase.jdbc2.jdbc.SybPooledConnection。(SybPooledConnection.java:72)
位于com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource.createConnection(SybConnectionPoolDataSource.java:138)
位于com.sybase.jdbc2.jdbc.SybDriver.connect(SybDriver.java:485)
位于com.sybase.jdbc2.jdbc.SybDriver.connect(SybDriver.java:517)
位于com.sybase.jdbc2.jdbc.SybDataSource.getConnection(SybDataSource.java:227)
位于com.sybase.jdbc2.jdbc.SybConnectionPoolDataSource.getPooledConnection(SybConnectionPoolDataSource.java:74)
位于com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper$1.run(InternalGenericDataStoreHelper.java:897)
位于com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
位于com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper.getPooledConnection(InternalGenericDataStoreHelper.java:892)
位于com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:1181)
位于com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:1047)
位于com.ibm.ws.rsadapter.spi.WSDefaultConnectionManagerImpl.allocateConnection(WSDefaultConnectionManagerImpl.java:81)
位于com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:431)
位于com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:400)
对于Oracle,我有一个:

java.sql.SQLException: invalid arguments in callDSRA0010E: SQL State = null, Error Code = 17,433
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:236)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:420)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:165)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
    at oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:297)
    at oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:221)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPhysicalConnection(OracleConnectionPoolDataSource.java:157)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:94)
    at oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:75)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper$1.run(InternalGenericDataStoreHelper.java:897)
    at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
    at com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper.getPooledConnection(InternalGenericDataStoreHelper.java:892)
    at com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:1181)
    at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:1047)
    at com.ibm.ws.rsadapter.spi.WSDefaultConnectionManagerImpl.allocateConnection(WSDefaultConnectionManagerImpl.java:81)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:431)
    at com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:400)
java.sql.SQLException:callDSRA0010E中的参数无效:sql State=null,错误代码=17433
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
位于oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:208)
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:236)
位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:420)
位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:165)
位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:35)
位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:801)
在oracle.jdbc.pool.OracleDataSource.getPhysicalConnection(OracleDataSource.java:297)
在oracle.jdbc.pool.OracleDataSource.getConnection(OracleDataSource.java:221)中
位于oracle.jdbc.pool.OracleConnectionPoolDataSource.getPhysicalConnection(OracleConnectionPoolDataSource.java:157)
在oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:94)中
在oracle.jdbc.pool.OracleConnectionPoolDataSource.getPooledConnection(OracleConnectionPoolDataSource.java:75)中
位于com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper$1.run(InternalGenericDataStoreHelper.java:897)
位于com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118)
位于com.ibm.ws.rsadapter.spi.InternalGenericDataStoreHelper.getPooledConnection(InternalGenericDataStoreHelper.java:892)
位于com.ibm.ws.rsadapter.spi.WSRdbDataSource.getPooledConnection(WSRdbDataSource.java:1181)
位于com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.createManagedConnection(WSManagedConnectionFactoryImpl.java:1047)
位于com.ibm.ws.rsadapter.spi.WSDefaultConnectionManagerImpl.allocateConnection(WSDefaultConnectionManagerImpl.java:81)
位于com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:431)
位于com.ibm.ws.rsadapter.jdbc.WSJdbcDataSource.getConnection(WSJdbcDataSource.java:400)
在这两种情况下,如果我将凭据传递给getConnection方法,则不会出现异常


谢谢你的建议。

我已经很久没有在这里使用WebFear ^H^H^H^Hphere做任何事情了,但我觉得你的配置有问题。有一个特殊的屏幕,您可以在其中创建凭据(用户/通行证),然后将这些凭据应用于创建的数据源。您配置的数据源似乎没有应用凭据。

简短回答:外部客户端无法使用身份验证别名数据

更长的回答:
从:

为组件管理的身份验证配置的别名不适用于必须访问安全资源的所有客户端。具有Java命名和D的外部Java客户机