Я пытаюсь работать с небольшой программой, где я могу подключиться к нескольким базам данных с помощью Spring и пытаться использовать транзакции Spring, развертывая мое веб-приложение на сервере weblogic. Проблема в том, что управление транзакциями не работает должным образом. Я пытаюсь вставить записи в 2 базы данных, первая вставляет без каких-либо исключений, где, когда второй запрос вставки написан таким образом, что он выдает исключение. В идеале в этой ситуации транзакция должна откат, но первая транзакция совершается без каких-либо проблем.Весенняя транзакция путем подключения к нескольким базам данных
Вот мой весна-config.xml файл
<context:component-scan base-package="com.examples" />
<!-- Database1 -->
<bean id="db1DataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb1" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<!-- Database2 -->
<bean id="db2DataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mydb2" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<tx:annotation-driven transaction-manager="txManager" />
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix" value=".jsp" />
</bean>
Это мой контроллер:
@Controller
public class EmployeeController {
@Autowired
private CommonEmployeeService commonService;
@RequestMapping(value = "/employee", method = GET)
public String showPersonListForGivenAge(
@RequestParam(value = "id") int id,
@RequestParam(value = "name") String name,
@RequestParam(value = "email") String email,
Map<String, Object> model) {
Employee e = new Employee(id,name);
EmployeeDetails details = new EmployeeDetails(id,email);
commonService.insert(e, details);
return "welcome";
}
}
Это моя общая служба:
@Service
public class CommonEmployeeService {
@Autowired
EmployeeDetailsService detailsService;
@Autowired
EmployeeService service;
@Transactional
public boolean insert(Employee e, EmployeeDetails details) {
service.insert(e);
detailsService.insert(details);
return true;
}
}
Это мой другие услуги:
EmployeeService.java
@Service
public class EmployeeService {
@Autowired
EmployeeDao dao;
//@Transactional(propagation=Propagation.REQUIRED)
public boolean insert(Employee e) {
return dao.insert(e);
}
}
EmployeeDetailsService.java - дао в этой службе бросает NullPointerException
@Service
public class EmployeeDetailsService {
@Autowired
EmployeeDetailsDao dao;
//@Transactional(propagation=Propagation.REQUIRED)
public boolean insert(EmployeeDetails e) {
return dao.insert(e);
}
}
Обновление: Добавление классов Dao:
EmployeeDao. java:
@Repository
public class EmployeeDao {
JdbcTemplate template;
@Resource(name = "db1DataSource")
public void setDataSource(DataSource dataSource) {
this.template = new JdbcTemplate(dataSource);
}
public boolean insert(Employee e) {
int cnt = template.update("insert into Employee values(?,?)",
e.getId(), e.getName());
if (cnt > 0) {
return true;
}
return false;
}
}
EmployeeDetailsDao.java
@Repository
public class EmployeeDetailsDao {
JdbcTemplate template;
@Resource(name = "db2DataSource")
public void setDataSource(DataSource dataSource) {
this.template = new JdbcTemplate(dataSource);
}
public boolean insert(EmployeeDetails e) {
if(e != null){
throw new NullPointerException();
}
int cnt = template.update("insert into EmployeeDetails values(?,?)",
e.getId(), e.getEmail());
if (cnt > 0) {
return true;
}
return false;
}
}
Где вы объявили у наши 'EmployeeDetailsDao' и' EmployeeDao' и ваш менеджер транзакций? – Arpit
@Arpit, добавил мои классы dao, я использую 'JtaTransactionManager', пожалуйста, проверьте мой конфигурационный файл весны, он есть. – user3181365
Вы используете JTA, не находясь в среде JTA, которая не будет работать. Вы в основном работаете без транзакций, то есть каждый оператор выполняет в своей собственной транзакции. Чтобы он работал, вам нужно, чтобы ваши источники данных были способными к XA, а не простой источник данных (что это сейчас). –