Skip to content

Commit 3440263

Browse files
committed
add lock to modify sql storage
1 parent 732ffa7 commit 3440263

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/SqlStorageSupplier.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,22 @@
1111
import java.sql.Connection;
1212
import java.sql.SQLException;
1313
import java.util.*;
14+
import java.util.concurrent.locks.Lock;
15+
import java.util.concurrent.locks.ReentrantLock;
1416
import java.util.stream.Collectors;
1517

1618
public abstract class SqlStorageSupplier implements DataStorageSupplier {
1719
protected final Logger logger = LoggerProvider.getLogger(getClass());
20+
private final Lock lock = new ReentrantLock();
1821

1922
protected abstract Connection getConnection() throws SQLException;
2023

2124
protected abstract void flushConnection(Connection connection);
2225

26+
protected boolean shouldLockWhenModify() {
27+
return false;
28+
}
29+
2330
protected abstract List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns);
2431

2532
protected abstract List<Object[]> toSaveValues(Object[] keys, Object[] values);
@@ -86,6 +93,9 @@ public Optional<V> load(K key) {
8693

8794
@Override
8895
public Optional<Modifier<K, V>> modify() {
96+
if (shouldLockWhenModify()) {
97+
lock.lock();
98+
}
8999
try {
90100
Connection connection = getConnection();
91101
Modifier<K, V> modifier = new Modifier<K, V>() {
@@ -144,6 +154,9 @@ public void commit() {
144154
logger.log(LogLevel.ERROR, "Failed to commit", e);
145155
} finally {
146156
flushConnection(connection);
157+
if (shouldLockWhenModify()) {
158+
lock.unlock();
159+
}
147160
}
148161
}
149162

@@ -155,6 +168,9 @@ public void rollback() {
155168
logger.log(LogLevel.ERROR, "Failed to rollback", e);
156169
} finally {
157170
flushConnection(connection);
171+
if (shouldLockWhenModify()) {
172+
lock.unlock();
173+
}
158174
}
159175
}
160176
};

storage/simple/src/main/java/me/hsgamer/topper/storage/simple/supplier/SqliteStorageSupplier.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ protected void flushConnection(Connection connection) {
4545
// EMPTY
4646
}
4747

48+
@Override
49+
protected boolean shouldLockWhenModify() {
50+
return true;
51+
}
52+
4853
@Override
4954
protected List<String> toSaveStatement(String name, String[] keyColumns, String[] valueColumns) {
5055
StringBuilder insertStatement = new StringBuilder("INSERT OR IGNORE INTO `")

0 commit comments

Comments
 (0)