2015-08-20 2 views
0

Я пытаюсь работать с небольшой программой, где я могу подключиться к нескольким базам данных с помощью 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; 
    } 
} 
+0

Где вы объявили у наши 'EmployeeDetailsDao' и' EmployeeDao' и ваш менеджер транзакций? – Arpit

+0

@Arpit, добавил мои классы dao, я использую 'JtaTransactionManager', пожалуйста, проверьте мой конфигурационный файл весны, он есть. – user3181365

+0

Вы используете JTA, не находясь в среде JTA, которая не будет работать. Вы в основном работаете без транзакций, то есть каждый оператор выполняет в своей собственной транзакции. Чтобы он работал, вам нужно, чтобы ваши источники данных были способными к XA, а не простой источник данных (что это сейчас). –

ответ

0

Попробуйте добавить ниже в spring-config.xml:

<context:component-scan base-package=“your.packagename.contatining.EmployeeDetailsDao” /> 
<mvc:annotation-driven /> 

и изменения @Transactional в вашем CommonEmployeeService с @Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRED) ниже

@Service 
public class CommonEmployeeService { 

    @Autowired 
    EmployeeDetailsService detailsService; 

    @Autowired 
    EmployeeService service; 

@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRED) 
    public boolean insert(Employee e, EmployeeDetails details) { 
     service.insert(e); 
     detailsService.insert(details); 
     return true; 
    } 
} 
+0

Привет, Арпит, попробовал, получив такое же исключение. Сканирование компонентов уже было в моем файле конфигурации (см. Обновленный файл конфигурации в моем вопросе). Что касается '@ Transactional' по умолчанию весенних откатов, транзакция по исключениям во время выполнения и поведение распространения по умолчанию является« обязательным », поэтому добавление этих изменений не решит мою проблему, я думаю. – user3181365

+0

Вы пытались добавить ''? – Arpit

+0

Пробовал только сейчас, получив ту же самую проблему – user3181365

Смежные вопросы