Skip to content

Commit d857cda

Browse files
committed
use includes
1 parent 62bc102 commit d857cda

File tree

8 files changed

+437
-163
lines changed

8 files changed

+437
-163
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
// start-customproductsrepo
4+
public interface CustomProductsRepository {
5+
void updateProductQuantity(String name, int newQty) ;
6+
int bulkInsertProducts(int count);
7+
}
8+
// end-customproductsrepo
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import com.mongodb.WriteConcern;
4+
import com.mongodb.bulk.BulkWriteResult;
5+
import com.mongodb.client.result.UpdateResult;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.beans.factory.annotation.Autowired;
9+
import org.springframework.data.mongodb.core.BulkOperations;
10+
import org.springframework.data.mongodb.core.MongoTemplate;
11+
import org.springframework.data.mongodb.core.query.Criteria;
12+
import org.springframework.data.mongodb.core.query.Query;
13+
import org.springframework.data.mongodb.core.query.Update;
14+
import org.springframework.stereotype.Component;
15+
16+
import java.time.Duration;
17+
import java.time.Instant;
18+
19+
// start-customproductsrepoimpl
20+
@Component
21+
public class CustomProductsRepositoryImpl implements CustomProductsRepository {
22+
23+
private static final Logger LOG = LoggerFactory
24+
.getLogger(CustomProductsRepository.class);
25+
26+
private final MongoTemplate mongoTemplate;
27+
28+
@Autowired
29+
public CustomProductsRepositoryImpl(MongoTemplate mongoTemplate){
30+
this.mongoTemplate = mongoTemplate;
31+
}
32+
33+
34+
public void updateProductQuantity(String name, int newQuantity) {
35+
Query query = new Query(Criteria.where("name").is(name));
36+
Update update = new Update();
37+
update.set("quantity", newQuantity);
38+
39+
UpdateResult result = mongoTemplate.updateFirst(query, update, Products.class);
40+
41+
if(result == null)
42+
LOG.error("No documents updated");
43+
else
44+
LOG.info(result.getModifiedCount() + " document(s) updated..");
45+
}
46+
47+
public int bulkInsertProducts(int count) {
48+
49+
LOG.info("Dropping collection...");
50+
mongoTemplate.dropCollection(Products.class);
51+
LOG.info("Dropped!");
52+
53+
Instant start = Instant.now();
54+
mongoTemplate.setWriteConcern(WriteConcern.W1.withJournal(true));
55+
56+
Products [] productList = Products.RandomProducts(count);
57+
BulkOperations bulkInsertion = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, Products.class);
58+
59+
for (int i=0; i<productList.length; ++i)
60+
bulkInsertion.insert(productList[i]);
61+
62+
BulkWriteResult bulkWriteResult = bulkInsertion.execute();
63+
64+
LOG.info("Bulk insert of "+bulkWriteResult.getInsertedCount()+" documents completed in "+ Duration.between(start, Instant.now()).toMillis() + " milliseconds");
65+
return bulkWriteResult.getInsertedCount();
66+
}
67+
}
68+
// end-customproductsrepoimpl
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import com.mongodb.ConnectionString;
4+
import com.mongodb.MongoClientSettings;
5+
import com.mongodb.client.MongoClient;
6+
import com.mongodb.client.MongoClients;
7+
import org.springframework.beans.factory.annotation.Value;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.data.mongodb.core.MongoTemplate;
11+
12+
import javax.net.ssl.SSLContext;
13+
import java.nio.file.Paths;
14+
import nl.altindag.ssl.SSLFactory;
15+
16+
// start-mongoconfig
17+
@Configuration
18+
public class MongoConfig {
19+
@Value("${mongodb.uri}")
20+
private String uri;
21+
@Value("${mongodb.database}")
22+
private String databaseName;
23+
24+
@Value("${truststore.path}")
25+
private String trustStorePath;
26+
@Value("${truststore.pwd}")
27+
private String trustStorePwd;
28+
29+
@Value("${mongodb.atlas}")
30+
private boolean atlas;
31+
32+
@Bean
33+
public MongoClient mongo() {
34+
35+
ConnectionString connectionString = new ConnectionString(uri);
36+
37+
MongoClientSettings mongoClientSettings = MongoClientSettings.builder()
38+
.applyConnectionString(connectionString)
39+
.applyToSslSettings(builder -> {
40+
if (!atlas) {
41+
// Use SSLContext if a trustStore has been provided
42+
if (!trustStorePath.isEmpty()) {
43+
SSLFactory sslFactory = SSLFactory.builder()
44+
.withTrustMaterial(Paths.get(trustStorePath), trustStorePwd.toCharArray())
45+
.build();
46+
SSLContext sslContext = sslFactory.getSslContext();
47+
builder.context(sslContext);
48+
builder.invalidHostNameAllowed(true);
49+
}
50+
}
51+
builder.enabled(true);
52+
})
53+
.build();
54+
55+
56+
return MongoClients.create(mongoClientSettings);
57+
}
58+
59+
@Bean
60+
public MongoTemplate mongoTemplate() throws Exception {
61+
return new MongoTemplate(mongo(), databaseName);
62+
}
63+
}
64+
// end-mongoconfig
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import net.datafaker.Faker;
4+
import org.slf4j.Logger;
5+
import org.slf4j.LoggerFactory;
6+
import org.springframework.data.annotation.Id;
7+
import org.springframework.data.mongodb.core.mapping.Document;
8+
9+
import java.util.Date;
10+
import java.util.Random;
11+
12+
// start-products-class
13+
@Document("products")
14+
public class Products {
15+
16+
private static final Logger LOG = LoggerFactory
17+
.getLogger(Products.class);
18+
19+
@Id
20+
private String id;
21+
private String name;
22+
private int qty;
23+
private double price;
24+
private Date available;
25+
private Date unavailable;
26+
private String skuId;
27+
28+
public Products(String name, int qty, double price, Date available, Date unavailable, String skuId) {
29+
this.name = name;
30+
this.qty = qty;
31+
this.price = price;
32+
this.available = available;
33+
this.unavailable = unavailable;
34+
this.skuId = skuId;
35+
}
36+
37+
public static Products [] RandomProducts( int count) {
38+
39+
Faker faker = new Faker();
40+
Random rand = new Random();
41+
42+
Products [] retProds = new Products[count];
43+
for (int i=0; i<count; ++i) {
44+
45+
Products p = new Products( faker.animal().name(),
46+
1+rand.nextInt(998),
47+
10.0+rand.nextInt(9999),
48+
new Date(), new Date(),
49+
faker.idNumber().valid());
50+
51+
retProds[i] = p;
52+
}
53+
return retProds;
54+
}
55+
56+
// Getters and setters
57+
}
58+
// end-products-class
59+
60+
// public String getName() {
61+
// return name;
62+
// }
63+
64+
// public void setName(String name) {
65+
// this.name = name;
66+
// }
67+
68+
// public int getQty() {
69+
// return qty;
70+
// }
71+
72+
// public void setQty(int qty) {
73+
// this.qty = qty;
74+
// }
75+
76+
// public double getPrice() {
77+
// return price;
78+
// }
79+
80+
// public void setPrice(double price) {
81+
// this.price = price;
82+
// }
83+
84+
// public Date getAvailable() {
85+
// return available;
86+
// }
87+
88+
// public void setAvailable(Date available) {
89+
// this.available = available;
90+
// }
91+
92+
// public Date getUnavailable() {
93+
// return unavailable;
94+
// }
95+
96+
// public void setUnavailable(Date unavailable) {
97+
// this.unavailable = unavailable;
98+
// }
99+
100+
// public String getSkuId() {
101+
// return skuId;
102+
// }
103+
104+
// public void setSkuId(String skuId) {
105+
// this.skuId = skuId;
106+
// }
107+
// }
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.mongodb.examples.springdatabulkinsert;
2+
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
5+
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.beans.factory.annotation.Value;
7+
import org.springframework.boot.CommandLineRunner;
8+
import org.springframework.boot.SpringApplication;
9+
import org.springframework.boot.autoconfigure.SpringBootApplication;
10+
11+
// start-application
12+
@SpringBootApplication
13+
public class SpringDataBulkInsertApplication implements CommandLineRunner {
14+
15+
@Value("${documentCount}")
16+
private int count;
17+
private static final Logger LOG = LoggerFactory
18+
.getLogger(SpringDataBulkInsertApplication.class);
19+
20+
@Autowired
21+
private CustomProductsRepository repository;
22+
23+
public static void main(String[] args) {
24+
SpringApplication.run(SpringDataBulkInsertApplication.class, args);
25+
}
26+
27+
@Override
28+
public void run(String... args) throws Exception {
29+
30+
repository.bulkInsertProducts(count);
31+
LOG.info("End run");
32+
System.exit(1);
33+
}
34+
}
35+
// end-application
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
mongodb.database=bulk
3+
4+
mongodb.uri=<connection string>
5+
mongodb.atlas=1
6+
7+
truststore.path=/etc/ssl/truststore.jks
8+
truststore.pwd=P4ssw0rd
9+
10+
documentCount=25000
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
4+
<modelVersion>4.0.0</modelVersion>
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>3.2.5</version>
9+
<relativePath/> <!-- Lookup parent from repository -->
10+
</parent>
11+
<groupId>com.mongodb.examples</groupId>
12+
<artifactId>SpringDataBulkInsert</artifactId>
13+
<name>SpringDataBulkInsert</name>
14+
<description>SpringDataBulkInsert</description>
15+
<properties>
16+
<java.version>17</java.version>
17+
</properties>
18+
<dependencies>
19+
<!-- Spring Boot Web Starter -->
20+
<dependency>
21+
<groupId>org.springframework.boot</groupId>
22+
<artifactId>spring-boot-starter-web</artifactId>
23+
</dependency>
24+
25+
<!-- Spring Data MongoDB -->
26+
<dependency>
27+
<groupId>org.springframework.boot</groupId>
28+
<artifactId>spring-boot-starter-data-mongodb</artifactId>
29+
</dependency>
30+
31+
<!-- Lombok (optional, for annotations like @Getter/@Setter) -->
32+
<dependency>
33+
<groupId>org.projectlombok</groupId>
34+
<artifactId>lombok</artifactId>
35+
<optional>true</optional>
36+
</dependency>
37+
38+
<!-- Testing -->
39+
<dependency>
40+
<groupId>org.springframework.boot</groupId>
41+
<artifactId>spring-boot-starter-test</artifactId>
42+
<scope>test</scope>
43+
<exclusions>
44+
<exclusion>
45+
<groupId>org.junit.vintage</groupId>
46+
<artifactId>junit-vintage-engine</artifactId>
47+
</exclusion>
48+
</exclusions>
49+
</dependency>
50+
51+
<dependency>
52+
<groupId>net.datafaker</groupId>
53+
<artifactId>datafaker</artifactId>
54+
<version>2.4.3</version>
55+
</dependency>
56+
57+
<!-- Security (optional) -->
58+
<dependency>
59+
<groupId>io.github.hakky54</groupId>
60+
<artifactId>sslcontext-kickstart</artifactId>
61+
<version>8.3.7</version>
62+
</dependency>
63+
64+
</dependencies>
65+
66+
<build>
67+
<plugins>
68+
<!-- Spring Boot Maven Plugin -->
69+
<plugin>
70+
<groupId>org.springframework.boot</groupId>
71+
<artifactId>spring-boot-maven-plugin</artifactId>
72+
</plugin>
73+
</plugins>
74+
</build>
75+
76+
</project>

0 commit comments

Comments
 (0)