【发布时间】:2015-05-24 12:01:02
【问题描述】:
我正在编写与 Oracle 数据库连接的应用程序。我从数据库调用函数,将新记录插入表中。在这个回调之后,我可以决定我想要做什么:提交或回滚。
不幸的是,我是 Spring 新手,所以我在配置方面遇到了问题。更重要的是,我想在 Java 类中进行此配置,而不是在 XML 中。在这里我需要你的帮助。
更新代码:
ApplicationConfig 代码:
@Configuration
@EnableTransactionManagement
@ComponentScan("hr")
@PropertySource({"classpath:jdbc.properties", "classpath:functions.properties", "classpath:procedures.properties"})
public class ApplicationConfig {
@Autowired
private Environment env;
@Bean(name="dataSource")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
dataSource.setDefaultAutoCommit(false);
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setResultsMapCaseInsensitive(true);
return jdbcTemplate;
}
@Bean(name="txName")
public PlatformTransactionManager txManager() {
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource());
return txManager;
}
}
我有 Dao 和 Service,它们都实现了正确的接口。
服务实现:
@Service
public class HumanResourcesServiceImpl implements HumanResourcesService {
@Autowired
private HumanResourcesDao hrDao;
@Override
public String generateData(int rowsNumber) {
return hrDao.generateData(rowsNumber);
}
@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
hrDao.shouldCommit(doCommit, connection);
}
}
Dao 实现:
@Repository
public class HumanResourcesDaoImpl implements HumanResourcesDao {
private JdbcTemplate jdbcTemplate;
private SimpleJdbcCall generateData;
@Autowired
public HumanResourcesDaoImpl(JdbcTemplate jdbcTemplate, Environment env) {
this.jdbcTemplate = jdbcTemplate;
generateData = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName(env.getProperty("procedure.generateData"));
}
@Override
public String generateData(int rowsNumber) {
HashMap<String, Object> params = new HashMap<>();
params.put("i_rowsNumber", rowsNumber);
Map<String, Object> m = generateData.execute(params);
return (String) m.get("o_execution_time");
}
@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
if(doCommit) {
connection.commit();
} else {
connection.rollback();
}
}
}
主类代码:
public class Main extends Application implements Initializable {
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
hrService = context.getBean(HumanResourcesService.class);
BasicDataSource ds = (BasicDataSource)context.getBean("dataSource");
Connection connection = ds.getConnection();
//do something and call
//hrService.generateData
//do something and call
//hrService.shouldCommit(true, connection);
//which commit or rollback generated data from previoues callback
}
}
更新:
我认为问题出在连接上,因为这句话:
this.jdbcTemplate.getDataSource().getConnection();
创建新连接,因此没有任何东西可以提交或回滚。但我仍然不明白为什么这不能正常工作。没有错误,没有新记录... 奇怪的是,当我调试 connection.commit(); 时,我发现在 DelegatingConnection.java 中,参数 this 有正确的连接,但是有类似的东西:
_conn.commit();
和_conn有不同的联系。为什么?
我应该以某种方式同步这两种方法的连接还是什么?或者这只是一种联系?老实说,我不确定它是如何工作的。一个连接和对存储过程的所有回调都在此连接中,或者可能与每个回调创建新连接?
真正的问题是如何提交或回滚先前回调中插入到表中的数据?
【问题讨论】:
-
您的问题是什么?有什么问题?
-
问题是我无法正确配置它...即使下面的指南不起作用...
-
问题应该是:如何提交或回滚先前回调中插入表的数据。
-
您希望数据库中有哪些数据?!!
-
这些来自生成数据的方法。我从数据库调用一个将数据插入表的过程。而已。之后,我想决定是提交还是回滚。
标签: java spring jdbc spring-transactions