java串行和并行两种方式实现读取mysql数据到文本文档
时间: 2024-02-24 14:57:08 浏览: 19
首先,使用串行方式实现读取MySQL数据到文本文档的代码如下:
```java
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SerialReadData {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
FileWriter fw = null;
try {
// 1. 获取数据库连接
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC", "root", "123456");
// 2. 创建Statement对象
stmt = conn.createStatement();
// 3. 查询数据
rs = stmt.executeQuery("SELECT * FROM student");
// 4. 将数据写入文本文件
fw = new FileWriter("student.txt");
while (rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
int age = rs.getInt("age");
fw.write(id + ", " + name + ", " + age + "\n");
}
fw.flush();
System.out.println("数据导出成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
if (fw != null) fw.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
}
```
接下来,使用并行方式实现读取MySQL数据到文本文档的代码如下:
```java
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class ParallelReadData {
static class Task implements Runnable {
private ResultSet rs;
private FileWriter fw;
public Task(ResultSet rs, FileWriter fw) {
this.rs = rs;
this.fw = fw;
}
@Override
public void run() {
try {
while (rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
int age = rs.getInt("age");
synchronized (fw) {
fw.write(id + ", " + name + ", " + age + "\n");
}
}
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
FileWriter fw = null;
try {
// 1. 获取数据库连接
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC", "root", "123456");
// 2. 创建Statement对象
stmt = conn.createStatement();
// 3. 查询数据
rs = stmt.executeQuery("SELECT * FROM student");
// 4. 将数据写入文本文件
fw = new FileWriter("student.txt");
ExecutorService executorService = Executors.newFixedThreadPool(10);
int count = Runtime.getRuntime().availableProcessors();
for (int i = 0; i < count; i++) {
executorService.execute(new Task(rs, fw));
}
executorService.shutdown();
while(!executorService.isTerminated()) {
Thread.sleep(1000);
}
System.out.println("数据导出成功!");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
if (fw != null) fw.close();
} catch (SQLException | IOException e) {
e.printStackTrace();
}
}
}
}
```
在并行方式中,我们使用了线程池来创建多个线程并发读取数据库,同时使用了同步锁来保证写入文件的安全性。