Bonjour,
Tu ne précise pas quelle version de Java tu cible, je vais donc me concentrer sur certains aspects de ton code.
Je vois aussi que tu n’utilise pas d’ORM (pour un si petit projet ça va encore, mais si ça grossit, il serait judicieux d’en utiliser un), on va donc rester dans ce cadre que tu t’es fixé.
Les duplications de code
Dans ton fichier Comments.java
A la place de :
PreparedStatement st = twoConnection.prepareStatement("INSERT INTO " + Config.TWO_PREFIX + "comments (" +
"comment_id," +
"comment_post_id," +
"comment_author," +
"comment_author_email," +
"comment_author_url," +
"comment_author_ip," +
"comment_date," +
"comment_date_gmt," +
"comment_content," +
"comment_karma," +
"comment_approved," +
"comment_agent," +
"comment_type," +
"comment_parent," +
"user_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
st.setString(1, rs.getString("comment_id"));
st.setString(2, rs.getString("comment_post_id"));
st.setString(3, rs.getString("comment_author"));
st.setString(4, rs.getString("comment_author_email"));
st.setString(5, rs.getString("comment_author_url"));
st.setString(6, rs.getString("comment_author_ip"));
st.setString(7, rs.getString("comment_date"));
st.setString(8, rs.getString("comment_date_gmt"));
st.setString(9, rs.getString("comment_content"));
st.setString(10, rs.getString("comment_karma"));
st.setString(11, rs.getString("comment_approved"));
st.setString(12, rs.getString("comment_agent"));
st.setString(13, rs.getString("comment_type"));
st.setString(14, rs.getString("comment_parent"));
st.setString(15, rs.getString("user_id"));
Je te conseille ça :
List<String> columns = Arrays.asList(
"comment_id",
"comment_post_id",
"comment_author",
"comment_author_email",
"comment_author_url",
"comment_author_ip",
"comment_date",
"comment_date_gmt",
"comment_content"
"comment_karma"
"comment_approved"
"comment_agent"
"comment_type"
"comment_parent",
"user_id"
);
String stCols = String.join(",", columns);
String stParams = String.join(",", Collections.nCopies(columns.size(), "?"));
PreparedStatement st = twoConnection.prepareStatement("INSERT INTO " + Config.TWO_PREFIX + "comments ("+ stCols +") VALUES ("+stParams+")");
for (int i = 0; i < columns.size(); i++) {
st.setString(i+1, rs.getString(columns.get(i)));
}
L’avantage principal (hormis le code plus court) est que tu évite de dupliquer tes noms de colonnes à deux endroits, ce qui le rend plus facile à faire évoluer.
Tu peux te servir de la même technique sur le traitement de commentmeta
ainsi que dans ton fichier Post.java.
Fermeture des connexion
Tu ouvres des connexion avec des lignes telles que Connection firstConnection = DriverManager.getConnection(Config.FIRST_URL, Config.FIRST_USERNAME, Config.FIRST_PASSWORD);
mais elle ne sont pas fermées quelque part.
Un simple firstConnection.close()
à la fin te permet de pallier à ce problème.
L’envoi des requêtes par batch
Je prend l’exemple sur le fichier Comments.java, mais le problème existe aussi dans le fichier Post.java
.
Pour insérer chaque ligne, je remarque que tu ouvres une nouvelle connexion, ce qui n’est pas très optimal. Tu pourrais envoyer tes requêtes par batchs.
Le code de ton fichier Comments.java
ressemblerait à ceci (je l’écris à la main, donc des erreurs de syntaxes peuvent s’y glisser) si je prends en compte toutes les remarques du dessus.
public class Comments {
public void insertData(Connection firstConnection, Connection twoConnection, String tableName, List<String> columns) {
ResultSet rs = firstConnection.createStatement().executeQuery("SELECT * FROM " + Config.FIRST_PREFIX + tableName);
String stCols = String.join(",", columns);
String stParams = String.join(",", Collections.nCopies(columns.size(), "?"));
PreparedStatement st = twoConnection.prepareStatement("INSERT INTO " + Config.TWO_PREFIX + tableName +" ("+ stCols +") VALUES ("+stParams+")");
while (rs.next()) {
for (int i = 0; i < columns.size(); i++) {
st.setString(i+1, rs.getString(columns.get(i)));
}
st.addBatch();
}
st.executeBatch();
st.close()
}
public static void process() throws SQLException {
Connection firstConnection = DriverManager.getConnection(Config.FIRST_URL, Config.FIRST_USERNAME, Config.FIRST_PASSWORD);
Connection twoConnection = DriverManager.getConnection(Config.TWO_URL, Config.TWO_USERNAME, Config.TWO_PASSWORD);
List<String> columns = Arrays.asList(
"comment_id",
"comment_post_id",
"comment_author",
"comment_author_email",
"comment_author_url",
"comment_author_ip",
"comment_date",
"comment_date_gmt",
"comment_content"
"comment_karma"
"comment_approved"
"comment_agent"
"comment_type"
"comment_parent",
"user_id");
List<String> metas = Arrays.asList(
"meta_id",
"comment_id",
"meta_key",
"meta_value");
insertData(firstConnection, twoConnection, "comments", columns);
insertData(firstConnection, twoConnection, "commentmeta", metas);
twoConnection.close();
firstConnection.close()
}
}
Tu peux t’en inspirer pour factoriser aussi ton code de la classe Post
qui s’appuierait sur la fonction insertData
que écrite ci-dessus.