java 在多服务上生成一个序列号不重复每天从0开始,格式为:SA+yyyy+001,不用redis
时间: 2024-04-15 09:28:16 浏览: 22
如果你不想使用Redis来实现序列号的生成,你可以考虑使用数据库来存储和管理序列号。
以下是一个基于数据库的实现示例,假设你使用的是MySQL数据库:
1. 创建一个名为`serial_numbers`的表,用于存储序列号和日期信息:
```sql
CREATE TABLE serial_numbers (
id INT AUTO_INCREMENT PRIMARY KEY,
date DATE,
counter INT
);
```
2. 在每个服务中,使用数据库连接库(如JDBC)连接到数据库。
3. 在生成序列号的方法中,首先查询数据库表中当天的记录。如果不存在,则插入一条新的记录;如果存在,则更新计数器值。
```java
import java.sql.*;
public class SerialNumberGenerator {
private static final String DB_URL = "jdbc:mysql://localhost:3306/your_database_name";
private static final String DB_USERNAME = "your_username";
private static final String DB_PASSWORD = "your_password";
private static final String DATE_FORMAT = "yyyy";
private static final String SERIAL_FORMAT = "SA%s%03d";
public static String generateSerialNumber() {
try (Connection connection = DriverManager.getConnection(DB_URL, DB_USERNAME, DB_PASSWORD);
Statement statement = connection.createStatement()) {
Date today = new Date(System.currentTimeMillis());
String query = "SELECT * FROM serial_numbers WHERE date = '" + today + "'";
ResultSet resultSet = statement.executeQuery(query);
if (resultSet.next()) {
int counter = resultSet.getInt("counter") + 1;
String serialNumber = String.format(SERIAL_FORMAT, today.toLocalDate().format(DateTimeFormatter.ofPattern(DATE_FORMAT)), counter);
String updateQuery = "UPDATE serial_numbers SET counter = " + counter + " WHERE date = '" + today + "'";
statement.executeUpdate(updateQuery);
return serialNumber;
} else {
String insertQuery = "INSERT INTO serial_numbers (date, counter) VALUES ('" + today + "', 1)";
statement.executeUpdate(insertQuery);
return String.format(SERIAL_FORMAT, today.toLocalDate().format(DateTimeFormatter.ofPattern(DATE_FORMAT)), 1);
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
System.out.println(generateSerialNumber());
System.out.println(generateSerialNumber());
System.out.println(generateSerialNumber());
}
}
```
这个示例代码中,我们首先建立了与数据库的连接,并根据当前日期查询数据库表。如果存在当天的记录,则更新计数器并返回新的序列号。如果不存在当天的记录,则插入一条新的记录并返回序列号。
需要注意的是,这个示例代码中使用了简单的SQL语句拼接,这可能存在SQL注入的安全风险。在实际生产环境中,建议使用参数化查询或ORM框架来执行数据库操作,以避免安全问题。
另外,需要确保数据库连接是线程安全的,以便在多个服务上并发生成序列号时能够正常工作。你可以使用连接池来管理数据库连接,以提高性能和并发能力。
相关推荐
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)