Вызовите DataSource.getConnection, не возвращая ожидаемое соединение - PullRequest
3 голосов
/ 20 апреля 2010

У меня есть следующий код:

        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 имеет правильный псевдоним аутентификации, и при проверке соединения он работает нормально со стороны 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)

А для 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)

В обоих случаях я не буду исключением, если передам учетные данные методу getConnection

Спасибо за ваш совет.

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

Краткий ответ: внешние клиенты не могут использовать данные псевдонима аутентификации

Более длинный ответ:
Из заводской документации WAS J2C :

Псевдоним, который вы настраиваете для управляемой компонентом аутентификации, не применяется ко всем клиентам, которые должны получить доступ к защищенному ресурсу. Внешние клиенты Java с доступом к Java Naming and Directory Interface (JNDI) могут искать ресурс Java 2 Connector (J2C), такой как источник данных или очередь Java Message Service (JMS). Однако им не разрешается использовать псевдоним управляемой компонентом аутентификации, определенный на ресурсе. Этот псевдоним является значением по умолчанию, которое используется, когда метод getConnection () не указывает какие-либо данные аутентификации, такие как пользователь и пароль, или значение для ConnectionSpec. Если внешнему клиенту необходимо получить соединение, он должен взять на себя ответственность за аутентификацию, передав его через аргументы вызова getConnection ().
0 голосов
/ 05 мая 2010

Даже после определения значений пользователя и пароля в качестве пользовательских свойств я обнаружил, что соединения для Oracle не работают. Спустя много дней я обнаружил, что на сервере разработки установлена ​​старая версия WAS 6.1, проблема, с которой я столкнулся, была исправлена ​​в WAS 6.1.0.5: PK32838: J2CA0046E, ПРИ ИСПОЛЬЗОВАНИИ С ПОМОЩЬЮ CUSTOM PROP PASSWORD ON DATASOURECE

Я попробовал свой код на другом сервере WAS с обновленным уровнем пакета исправлений WAS и ... он работал без единого изменения в коде или конфигурации. Таким образом, решение состоит в том, чтобы обновить сервер WAS.

Спасибо.

0 голосов
/ 20 апреля 2010

Прошло много времени с тех пор, как я что-то делал с WebSFEAR ^ H ^ H ^ H ^ Hphere, но мне кажется, что у вас проблема с конфигурацией. Был специальный экран, на котором вы создавали учетные данные (пользователь / пароль), а затем применяли эти учетные данные к созданному источнику данных. Похоже, к вашему настроенному источнику данных не применены учетные данные.

...