У меня есть приложение, работающее на Websphere Liberty, которое должно сравнивать таблицы из 2 баз данных / схем.
Пользователь должен иметь возможность вводить данные соединения, такие как хост и учетные данные.
Я использую Hibernate для доступа к базе данных приложения.
Я пытался использовать несколько единиц персистентности, одну для базы данных приложения и одну для всех других баз данных.
Но я получил 2 проблемы:
- я получаю ошибку "Недопустимая попытка зачисления нескольких 1P C XAResources" иногда
- может запросить 2 БД с предоставленными пользователем учетными данными, но я не получаю результатов за исключением случаев, когда я подключаюсь к той же базе данных, указанной на сервере. xml файл, что и DataSource
Это источники данных на сервере. xml на сервере (dbs oracle dbs)
<dataSource id="MyAppDS" jndiName="jdbc/MyDS" type="javax.sql.ConnectionPoolDataSource">
<jdbcDriver javax.sql.ConnectionPoolDataSource="oracle.jdbc.pool.OracleConnectionPoolDataSource" libraryRef="OracleSQLLib"/>
<connectionManager agedTimeout="30m" connectionTimeout="10s" maxPoolSize="20" minPoolSize="5"/>
<properties password="..." url="jdbc:oracle:thin:@...:1521:..." user="..."/>
</dataSource>
<dataSource id="OtherOracle" jndiName="jdbc/OtherOracle" type="javax.sql.ConnectionPoolDataSource">
<jdbcDriver javax.sql.ConnectionPoolDataSource="oracle.jdbc.pool.OracleConnectionPoolDataSource" libraryRef="OracleSQLLib"/>
<connectionManager agedTimeout="30m" connectionTimeout="10s" maxPoolSize="20" minPoolSize="5"/>
<properties password="..." url="jdbc:oracle:thin:@127.0.0.1:1521:XE" user="..."/>
</dataSource>
Это постоянство. xml в модуле EJB
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name="main-persistence">
<jta-data-source>jdbc/MyDS</jta-data-source>
<class>classes...</class>
<properties>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.Oracle9iDialect" />
<property name="hibernate.temp.use_jdbc_metadata_defaults"
value="false" />
</properties>
</persistence-unit>
<persistence-unit name="other-persistence" transaction-type="RESOURCE_LOCAL">
<non-jta-data-source>jdbc/OtherOracle</non-jta-data-source>
<class>classes...</class>
<properties>
<property name="hibernate.transaction.jta.platform"
value="org.hibernate.service.jta.platform.internal.WebSphereExtendedJtaPlatform" />
<property name="hibernate.dialect"
value="org.hibernate.dialect.Oracle9iDialect" />
<property name="hibernate.temp.use_jdbc_metadata_defaults"
value="false" />
</properties>
</persistence-unit>
В компоненте Java я использую EntityManagerFactory
@PersistenceUnit(unitName = "other-persistence")
private EntityManagerFactory emf;
И я создаю менеджер сущностей с пользовательским кредитом. enals как это
Map<String, String> properties = new HashMap<String, String>();
properties.put("hibernate.connection.driver_class", "oracle.jdbc.OracleDriver");
properties.put("hibernate.connection.url", myCustomCreatedConnectionUrl);
properties.put("hibernate.connection.username", customUser);
properties.put("hibernate.connection.password", customPassword);
properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle9iDialect");
properties.put("hibernate.show-sql", "true");
EntityManager entityManager = emf.createEntityManager(properties);
Если я проверяю свойства EntityManager с getProperties, все кажется правильным. Но запросы работают только в том случае, если учетные данные / хост = для источника данных. В противном случае я не получаю результатов (но без ошибок)
В чем может быть проблема? Есть ли способ использовать только один модуль сохраняемости, но с настраиваемым хостом / учетными данными для разных запросов?