0

I am required to use a read only account to run select query on maria db and export the result via spring batch. at the moment i am getting "update denied for user". i want the batch to not update the database.

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.MyProject</groupId>
 <artifactId>SpringBatchDatabaseToCsv</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>SpringBatchDatabaseToCsv</name>
 <description>Demo project for Spring Boot</description>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>1.5.10.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-batch</artifactId>
 </dependency>
 <dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.0.4</version>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.springframework.batch</groupId>
 <artifactId>spring-batch-test</artifactId>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 </plugin>
 </plugins>
 </build>
</project>

User.java

public class User {
 private Integer id;
 private String name;
 public Integer getId() {
 return id;
 }
 public void setId(Integer id) {
 this.id = id;
 }
 public String getName() {
 return name;
 }
 public void setName(String name) {
 this.name = name;
 }
}

UserItemProcessor.java

import org.springframework.batch.item.ItemProcessor;
import com.MyProject.model.User;
public class UserItemProcessor implements ItemProcessor<User, User> {
 @Override
 public User process(User user) throws Exception {
 return user;
 }
}

BatchConfiguration.java

package com.MyProject; import java.sql.ResultSet; import java.sql.SQLException; import javax.sql.DataSource; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; import org.springframework.batch.core.launch.support.RunIdIncrementer; import org.springframework.batch.item.database.JdbcCursorItemReader; import org.springframework.batch.item.file.FlatFileItemWriter; import org.springframework.batch.item.file.transform.BeanWrapperFieldExtractor; import org.springframework.batch.item.file.transform.DelimitedLineAggregator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.io.ClassPathResource; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.datasource.DriverManagerDataSource;

import com.MyProject.model.User;
@Configuration
@EnableBatchProcessing
public class BatchConfiguration {
 @Autowired
 public JobBuilderFactory jobBuilderFactory;
 @Autowired
 public StepBuilderFactory stepBuilderFactory;
 @Autowired
 public DataSource dataSource;
 @Bean
 public DataSource dataSource() {
 final DriverManagerDataSource dataSource = new DriverManagerDataSource();
 dataSource.setDriverClassName("com.mysql.jdbc.Driver");
 dataSource.setUrl("jdbc:mysql://localhost/springbatch");
 dataSource.setUsername("root");
 dataSource.setPassword("root");
 return dataSource;
 }
 
 @Bean
 public JdbcCursorItemReader<User> reader(){
 JdbcCursorItemReader<User> reader = new JdbcCursorItemReader<User>();
 reader.setDataSource(dataSource);
 reader.setSql("SELECT id,name FROM user");
 reader.setRowMapper(new UserRowMapper());
 return reader;
 }
 
 public class UserRowMapper implements RowMapper<User>{
 @Override
 public User mapRow(ResultSet rs, int rowNum) throws SQLException {
 User user = new User();
 user.setId(rs.getInt("id"));
 user.setName(rs.getString("name"));
 return user;
 }
 }
 
 @Bean
 public UserItemProcessor processor(){
 return new UserItemProcessor();
 }
 
 @Bean
 public FlatFileItemWriter<User> writer(){
 FlatFileItemWriter<User> writer = new FlatFileItemWriter<User>();
 writer.setResource(new ClassPathResource("users.csv"));
 writer.setLineAggregator(new DelimitedLineAggregator<User>() {{
 setDelimiter(",");
 setFieldExtractor(new BeanWrapperFieldExtractor<User>() {{
 setNames(new String[] { "id", "name" });
 }});
 }});
  return writer;
 }
 
 @Bean
 public Step step1() {
 return stepBuilderFactory.get("step1").<User, User> chunk(10)
 .reader(reader())
 .processor(processor())
 .writer(writer())
 .build();
 }
 
 @Bean
 public Job exportUserJob() {
 return jobBuilderFactory.get("exportUserJob")
 .incrementer(new RunIdIncrementer())
 .flow(step1())
 .end()
 .build();
 }
 }
arihanqt
  • 1
  • 1
  • i created batch as per https://www.jackrutorial.com/2018/03/spring-boot-batch-read-from-mysql-database-and-write-into-a-csv-file-tutorial.html (did not use the create data base part). when i ran the program it gave an error - UPDATE command denied to user 'arihant'@'10.16.49.23' for table 'TASK_SEQ', i am not updating anything in database still getting this erro – arihanqt Apr 29 '21 at 11:31
  • Please update your question to include the relevant code that perform the mentioned query. Did you use the exact same sql query as the tutorial? – Adhika Setya Pramudita Apr 29 '21 at 16:47
  • added in question description – arihanqt Apr 29 '21 at 18:14
  • error - UPDATE command denied to user 'root'@'10.123.23.88' for table 'TASK_SEQ' – arihanqt Apr 29 '21 at 18:16
  • basically i want to prevent creating batch tables - as the account being used is readonly – arihanqt Apr 29 '21 at 18:24
  • @arihanqt See https://stackoverflow.com/a/48500494/5019386. – Mahmoud Ben Hassine Apr 30 '21 at 07:44

0 Answers0