Вы должны быть в состоянии использовать образец OpenCSV, в точности так, как это указано в документации. Таким образом, вам не нужно писать какие-либо собственные журналы дозирования c.
. Мне удалось записать 6 миллионов записей в CSV-файл примерно за 10 секунд. Чтобы было ясно - это было только время записи файла, а не время извлечения данных из БД, но я думаю, что оно должно быть достаточно быстрым для ваших нужд.
Вот ваш код с адаптациями для использования на основе OpenCSV о его документированном подходе ... Но, пожалуйста, смотрите предупреждение в конце моих заметок!
import com.opencsv.CSVWriter;
import com.opencsv.ResultSetHelperService;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Date;
import java.text.SimpleDateFormat;
public class OpenCSVDemo {
static int fetchlimit_src = 100;
static Connection con = null;
static Statement stmt = null;
static ResultSet rs = null;
static String filename = "C:\\Data\\filename.csv";
public static void main(String args[]) {
try {
connection();
retrieveData(con);
} catch (Exception e) {
System.out.println(e);
}
}
private static void connection() throws Exception {
try {
final String jdbcDriver = "YOURS GOES HERE";
final String dbUrl = "YOURS GOES HERE";
final String user = "YOURS GOES HERE";
final String pass = "YOURS GOES HERE";
Class.forName(jdbcDriver);
con = DriverManager.getConnection(dbUrl, user, pass);
System.out.println("Connection successful");
} catch (Exception e) {
System.out.println("Exception while establishing sql connection");
throw e;
}
}
private static void retrieveData(Connection con) throws Exception {
try {
stmt = con.createStatement();
String query = "select title_id, primary_title from imdb.title";
System.out.println(query);
stmt = con.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
stmt.setFetchSize(fetchlimit_src);
System.out.println("**** Started querying src **** " + new Date());
rs = stmt.executeQuery(query);
System.out.println("**** Completing querying src **** " + new Date());
// resultset_List(rs); // If required store resultset(rs) to HashMap
System.out.println();
String timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
System.out.println("Started writing CSV: " + timeStamp);
writeToCsv(rs, filename, null, Boolean.FALSE);
timeStamp = new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());
System.out.println("Finished writing CSV: " + timeStamp);
System.out.println();
} catch (Exception e) {
System.out.println("Exception while retrieving data");
e.printStackTrace();
throw e;
} finally {
rs.close();
stmt.close();
con.close();
}
}
public static int writeToCsv(final ResultSet rs, final String fileName,
final String header, final boolean aync) throws Exception {
try (CSVWriter writer = new CSVWriter(fileName)) {
//Define fetch size(default as 30000 rows), higher to be faster performance but takes more memory
ResultSetHelperService.RESULT_FETCH_SIZE = 1000;
//Define MAX extract rows, -1 means unlimited.
ResultSetHelperService.MAX_FETCH_ROWS = 2000;
writer.setAsyncMode(aync);
int result = writer.writeAll(rs, true);
return result - 1;
}
}
}
Примечания:
1) Я использовал "asyn c", установленный на false:
writeToCsv(rs, filename, null, Boolean.FALSE);
Возможно, вы захотите поэкспериментировать с этими и другими настройками, чтобы увидеть, имеют ли они какое-либо существенное значение для вас.
2) Относительно вашего комментария " ссылка включает в себя много других классов": весь JAR-файл библиотеки OpenCSV должен быть включен в ваш проект, также как и связанный JAR-нарушитель:
opencsv.jar
disruptor-3.3.6.jar
Чтобы получить файлы JAR, go для GitHub page , нажмите зеленую кнопку, выберите загрузку zip, распакуйте zip-файл и посмотрите в папку «OpenCSV-master \ release».
Добавьте эти два JAR-файла в Ваш проект обычным способом (зависит от того, как вы строите ваш проект).
3) ВНИМАНИЕ: Этот код работает нормально при использовании Oracle Java 8 JDK / JRE. Если вы попытаетесь использовать OpenJDK (например, для Java 13 или аналогичный), он не будет работать. Это из-за некоторых изменений за кулисами скрытых классов. Если вам интересно, здесь есть более подробная информация здесь .
Если вам нужно использовать OpenJDK-версию Java, вам, возможно, повезет больше с библиотекой, в которой эта библиотека CSV основан: см. здесь .