帮忙用java语言写一份多线程访问数据库获取大量数据的demo
时间: 2023-12-10 17:37:34 浏览: 103
好的,以下是一个简单的多线程访问数据库获取大量数据的 Java Demo:
```java
import java.sql.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class DatabaseThreadDemo {
// 数据库驱动名和连接URL
static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
static final String DB_URL = "jdbc:mysql://localhost/mydatabase?useSSL=false";
// 数据库用户名和密码
static final String USER = "root";
static final String PASS = "password";
// 定义线程数
static final int THREAD_NUM = 5;
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// 注册 JDBC 驱动器
Class.forName(JDBC_DRIVER);
// 打开一个连接
System.out.println("连接数据库...");
conn = DriverManager.getConnection(DB_URL, USER, PASS);
// 创建一个语句对象
System.out.println("实例化 Statement 对象...");
stmt = conn.createStatement();
// 创建线程池
ExecutorService executor = Executors.newFixedThreadPool(THREAD_NUM);
// 创建多个线程来查询数据库
for (int i = 0; i < THREAD_NUM; i++) {
executor.execute(new DatabaseThread(stmt));
}
// 关闭线程池
executor.shutdown();
// 等待所有线程完成
while (!executor.isTerminated()) {
}
System.out.println("查询完成!");
} catch (SQLException se) {
// 处理 JDBC 错误
se.printStackTrace();
} catch (Exception e) {
// 处理 Class.forName 错误
e.printStackTrace();
} finally {
// 关闭资源
try {
if (stmt != null) stmt.close();
} catch (SQLException se2) {
} // 什么都不做
try {
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
System.out.println("Goodbye!");
}
}
}
class DatabaseThread implements Runnable {
private Statement stmt;
public DatabaseThread(Statement stmt) {
this.stmt = stmt;
}
public void run() {
try {
// 执行查询
ResultSet rs = stmt.executeQuery("SELECT * FROM mytable");
// 处理结果集
while (rs.next()) {
// 读取数据
int id = rs.getInt("id");
String name = rs.getString("name");
// 输出数据
System.out.println("ID: " + id + ", Name: " + name);
}
// 关闭结果集
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
```
这个 Demo 中,我们使用了 Java 的线程池来实现多线程查询数据库。首先,我们创建一个 `DatabaseThread` 类,它实现了 `Runnable` 接口,用于查询数据库。然后,在 `main` 方法中,我们创建了一个连接对象和一个语句对象,然后使用线程池创建多个 `DatabaseThread` 线程对象来查询数据库。最后,我们关闭了连接和语句对象,并等待所有线程完成。
阅读全文