请基于JDBC设计开发一套数据库连接池程序,要求支持多线程并发连接数据库,并从数据库中查询数据信息。具体要求如下: (1) 要求使用单例模式(懒汉式)实现连接池; (2) 要求支持多线程并发访问数据库,并在测试中体现; (3) 要求给出数据库表结构,并包含适量的数据;
时间: 2024-10-14 18:05:01 浏览: 39
基于JDBC设计的数据库连接池程序,我们可以采用Spring框架提供的`DataSource`和`JdbcTemplate`来进行简化操作,同时利用单例模式保证只有一个实例供所有线程共享。这里是一个简化的示例:
```java
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.stereotype.Component;
@Component
public class DatabasePool {
private static volatile DatabasePool instance; // 懒汉式单例
private DriverManagerDataSource dataSource;
private DatabasePool() {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try {
dataSource = new DriverManagerDataSource(url, username, password);
} catch (Exception e) {
throw new RuntimeException("Failed to initialize database pool", e);
}
}
public static DatabasePool getInstance() {
if (instance == null) {
synchronized (DatabasePool.class) {
if (instance == null) {
instance = new DatabasePool();
}
}
}
return instance;
}
public Connection getConnection() throws SQLException {
return dataSource.getConnection(); // 获取数据库连接
}
// 示例:查询数据
public List<User> getUsers(String sql) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
return jdbcTemplate.query(sql, new Object[]{}, new UserRowMapper());
}
private interface UserRowMapper extends RowMapper<User> {
@Override
User mapRow(ResultSet rs, int rowNum);
}
}
// 数据库表结构示例(MySQL)
CREATE TABLE Users (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(50)
);
// 测试部分(多线程并发查询)
@Test
@DisplayName("Test concurrent database access")
public void testConcurrentAccess() {
ExecutorService executor = Executors.newFixedThreadPool(10); // 创建线程池
for (int i = 0; i < 100; i++) {
executor.submit(() -> {
try {
List<User> users = DatabasePool.getInstance().getUsers("SELECT * FROM Users");
// 对查询结果做处理...
} catch (SQLException e) {
log.error("Error in accessing the database", e);
}
});
}
executor.shutdown();
}
```
在这个例子中,`DatabasePool`类实现了单例模式,提供了一个静态的`getInstance()`方法获取数据库连接池的唯一实例。`getConnection()`方法用于获取连接,而`getUsers()`方法则通过JdbcTemplate执行SQL查询。
注意,在实际项目中,还需要考虑资源关闭、异常处理以及适当的日志记录。此外,这个示例假设已经安装了MySQL数据库驱动并配置好环境变量。
阅读全文