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

我有以下代码:

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时,我得到一个exception。 数据源是WAS具有正确的身份validation别名集,并且在测试连接时,它可以从WAS端正常工作,但之前的代码将无法正常工作。

如果我改变这一行: conn = ds.getConnection();

对此: conn = ds.getConnection(“username”,“password”);

然后代码将工作! 但这不是我想要的,因为数据源中的连接应该已经设置了凭据。 我最初认为这是一个Sybase问题,但它也发生在Oracle上,所以宁愿说我有WAS问题。

如果您对exception感到好奇,对于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.(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.(SybConnection.java:200) at com.sybase.jdbc2.jdbc.SybPooledConnection.(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) 

对于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.(PhysicalConnection.java:420) at oracle.jdbc.driver.T4CConnection.(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) 

在这两种情况下,如果我将凭证传递给getConnection方法,我将不会例外

谢谢你的建议。

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

更长的答案:
从WAS J2C连接工厂文档 :

为组件管理的身份validation配置的别名不适用于必须访问受保护资源的所有客户端。 具有Java命名和目录接口(JNDI)访问权限的外部Java客户端可以查找Java 2连接器(J2C)资源,例如数据源或Java消息服务(JMS)队列。 但是,不允许它们利用资源上定义的组件管理的身份validation别名。 此别名是getConnection()方法未指定任何身份validation数据(如用户和密码)或ConnectionSpec值时使用的默认值。 如果外部客户端需要获得连接,则必须通过在getConnection()调用上传递参数来承担身份validation的责任。

自从我用WebSFEAR ^ H ^ H ^ H ^ Hphere做了很多事以来,已经有很长一段时间了,但我认为你有一个配置问题。 有一个特殊的屏幕,您可以在其中创建凭据(用户/通行证),然后您将这些凭据应用于创建的数据源。 看起来您配置的数据源未应用凭据。

即使将用户/密码值定义为自定义属性,我发现Oracle的连接无法正常工作。 经过很多天,我刚刚发现开发服务器运行的是旧的WAS 6.1版本,我遇到的问题已在WAS 6.1.0.5中修复: PK32838:J2CA0046E在DATASOURECE上使用CUSTOM PROP PASSWORD

我在具有更新的WAS修订包级别的不同WAS服务器中尝试了我的代码,并且…在没有在代码或配置中引入单个更改的情况下工作。 所以解决方案是升级WAS服务器。

谢谢。