EJB3-использование 2 единиц сохранения в транзакции (исключение: локальная транзакция уже имеет 1 ресурс, отличный от XA)
Я пытаюсь использовать 2 единицы персистентности в одной транзакции в приложении Java EE, развернутом на Glassfish.
2 единицы персистентности определены в персистентности.xml, следующим образом:
<persistence-unit name="BeachWater">
<jta-data-source>jdbc/BeachWater</jta-data-source>
...
<persistence-unit name="LIMS">
<jta-data-source>jdbc/BeachWaterLIMS</jta-data-source>
...
эти единицы персистентности соответствуют ресурсам JDBC и пулам соединений, которые я определил в Glassfish следующим образом (включите один здесь, поскольку оба они идентичны, кроме имен и информации о подключении к базе данных):
JDBC Resource:
JNDI Name: jdbc/BeachWaterLIMS
Pool Name: BEACHWATER_LIMS
Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource
Resource Type: javax.sql.ConnectionPoolDataSource
есть 3 гражданства сеансовые бобы, LimsServiceBean, AnalysisServiceBean и AnalysisDataTransformationServicebean.
вот соответствующие фрагменты из LimsServiceBean:
@PersistenceContext(unitName = "LIMS")
EntityManager em;
...
public ArrayList<Sample> getLatestLIMSData() {
Query q = em.createNamedQuery("Sample.findBySubTypeStatus");
return new ArrayList<Sample>(q.getResultList());
}
Из AnalysisServiceBean:
@PersistenceContext(unitName = "BeachWater")
EntityManager em;
...
public ArrayList<AnalysisType> getAllAnalysisTypes() {
Query q = em.createNamedQuery("AnalysisType.findAll");
return new ArrayList<AnalysisType>(q.getResultList());
}
и из AnalysisDataTransformationServicebean:
@EJB
private AnalysisService analysisService;
@EJB
private LimsService limsService;
public void transformData() {
List<AnalysisType> analysisTypes = analysisService.getAllAnalysisTypes();
ArrayList<Sample> samples = limsService.getLatestLIMSData();
этот вызов limsService.getLatestLIMSData () вызвало следующее исключение:
[exec] Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException
[exec] Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: java.lang.IllegalStateException: Local transaction already has 1 non-XA Resource: cannot add more resources.
проконсультировавшись с этой страницы, http://msdn.microsoft.com/en-us/library/ms378484.aspx (среди многих других) я попытался изменить определение пулов соединений на:
Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerXADataSource
Resource Type: javax.sql.XADataSource
Ping через консоль администратора Glassfish успешно, но вызовите analysisService.getAllAnalysisTypes () теперь выдает исключение:
Caused by: javax.ejb.TransactionRolledbackLocalException: Exception thrown from bean; nested exception is: Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: javax.transaction.SystemException
The resource manager is doing work outside a global transaction javax.transaction.xa.XAException: com.microsoft.sqlserver.jdbc.SQLServerException: Failed to create the XA control connection. Error: "Could not find stored procedure 'master..xp_sqljdbc_xa_init_ex'."
какие идеи?
2 ответов
изменение конфигурации пула соединений в Glassfish:
Connection Pool:
Name: BEACHWATER_LIMS
Datasource Classname: com.microsoft.sqlserver.jdbc.SQLServerXADataSource
Resource Type: javax.sql.XADataSource
следуйте инструкциям в блоге Senthil Balakrishnan: "как заставить MSSQL Server XA Datasource работать?"вот, http://www.senthilb.com/2010/01/how-to-make-xa-datasource-work-in-mssql.html.
Перезапустить Glassfish.
чтобы использовать две единицы персистентности (и, следовательно, два источника данных) в транзакции, вам действительно нужно использовать соединения XA и соответствующим образом настроить пулы (по крайней мере, один из них, GlassFish поддерживает последнюю оптимизацию агента, которая позволяет заручиться одним ресурсом, отличным от XA, см. http://docs.sun.com/app/docs/doc/820-7695/beanm?a=view). Это была первая ошибка.
для второй ошибки, кажется, трудно сказать что-либо с текущим уровнем деталей. Не могли бы вы предоставить трассировку стека (при необходимости активируйте более точное ведение журнала)?