Подключение на основе кошелька JDBC Oracle: папка кошелька в памяти

Я хочу подключиться к базе данных Oracle, используя кошелек, хранящийся в памяти, вместо того, чтобы хранить кошелек на диске.

Я пробовал использовать Apache Common VFS для чтения / записи файлов в памяти. Кошелек записывается в память (чтобы быть уверенным, что я даже записал папку кошелька из оперативной памяти на свой диск).

properties.put("oracle.net.tns_admin", "ram://my_wallet");
properties.put("oracle.net.wallet_location",
          String.format("(SOURCE=(METHOD=file)(METHOD_DATA=(DIRECTORY=%s)))", "ram://my_wallet"));

Когда я пытаюсь установить соединение, используя эти свойства, я получаю сообщение об ошибке:

java.sql.SQLRecoverableException: IO Error: could not resolve the connect identifier DB_1222

PS: Мой код работает нормально, если я кладу кошелек на диск.


person Nabila    schedule 26.11.2019    source источник
comment
Адаптера от API VFS к java.io.File нет, поэтому Oracle, не знающий о VFS FileObjects, не может использовать эти URL. Я не уверен, может ли Oracle читать ресурсы из загрузчика классов, тогда вы могли бы предоставить им тот, который выполняет этот интерфейс. Я также не уверен, может ли Oracle читать из URLConnection, но то же самое применимо, обычно это не предоставляется VFS. Забавное замечание о сайте: когда вы используете инструмент oracles sqlcl, который имеет возможность читать ZIP-файлы кошелька, он расширяет их во временный каталог и передает его в параметр tnsadmin в URL-адресе.   -  person eckes    schedule 06.11.2020


Ответы (3)


Одним из обходных путей может быть использование поддержки файловой системы в памяти ОС, чтобы он выглядел как обычный файл для JDBC, но ОС фактически хранит его в памяти. В Unix-подобных системах tmpfs будет такой файловой системой: https://en.m.wikipedia.org/wiki/Tmpfs.

person Korbi    schedule 27.11.2019

К сожалению, Oracle JDBC в настоящее время не поддерживает получение кошелька из памяти.

person Kuassi Mensah    schedule 27.11.2019

Я знаю, что это старый вопрос, но теперь вы можете установить SSLContext для OracleDatasource и заставить контекст читать кошелек из любого входного потока:

        TrustManagerFactory trustManagerFactory =
                TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        KeyManagerFactory keyManagerFactory =
                KeyManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());

        KeyStore keyStore = KeyStore.getInstance("SSO", new OraclePKIProvider());


        // ** Read wallet in-memory here **
        keyStore.load(new ByteArrayInputStream(your_wallet_in_memory), null);


        keyManagerFactory.init(keyStore, null);
        trustManagerFactory.init(keyStore);

        SSLContext sslContext = SSLContext.getInstance("SSL");
        sslContext.init(
                keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);

        Properties info = new Properties();

        info.put(OracleConnection.CONNECTION_PROPERTY_USER_NAME, userName);
        info.put(OracleConnection.CONNECTION_PROPERTY_PASSWORD, userPassword);

        OracleDataSource ods = new OracleDataSource();
        ods.setURL(dbUrl);
        ods.setConnectionProperties(info);
        ods.setSSLContext(sslContext);

Я разместил образец службы с использованием этого подхода, а также тесты с использованием различных типов кошельков в этом репо: https://github.com/nomisvai/oracle-in-memory-wallet-samples

person Simon V    schedule 09.04.2021