提交 12400e6b authored 作者: LaughingMan's avatar LaughingMan

Move large chunk of code into its own method

上级 b80c3fb5
...@@ -136,66 +136,73 @@ public class CreateCluster extends Tool { ...@@ -136,66 +136,73 @@ public class CreateCluster extends Tool {
// so that data can't change while restoring the second database // so that data can't change while restoring the second database
statSource.execute("SET EXCLUSIVE 2"); statSource.execute("SET EXCLUSIVE 2");
try (PipedReader pipeReader = new PipedReader()) { try {
/* performTransfer(statSource, urlTarget, user, password, serverList);
* Pipe writer is used + closed in the inner class, in a } finally {
* separate thread (needs to be final). It should be initialized // switch back to the regular mode
* within try{} so an exception could be caught if creation statSource.execute("SET EXCLUSIVE FALSE");
* fails. In that scenario, the the writer should be null and }
* needs no closing, and the main goal is that finally{} should }
* bring the source DB out of exclusive mode, and close the }
* reader.
*/ private static void performTransfer(Statement statSource, String urlTarget,
final PipedWriter pipeWriter = new PipedWriter(pipeReader); String user, String password, String serverList) throws SQLException {
try (PipedReader pipeReader = new PipedReader()) {
// Backup data from source database in script form. /*
// Start writing to pipe writer in separate thread. * Pipe writer is used + closed in the inner class, in a
final ResultSet rs = statSource.executeQuery("SCRIPT"); * separate thread (needs to be final). It should be initialized
* within try{} so an exception could be caught if creation
// Delete the target database first. * fails. In that scenario, the the writer should be null and
try (Connection connTarget = DriverManager.getConnection( * needs no closing, and the main goal is that finally{} should
urlTarget + ";CLUSTER=''", user, password); * bring the source DB out of exclusive mode, and close the
Statement statTarget = connTarget.createStatement()) * reader.
{ */
statTarget.execute("DROP ALL OBJECTS DELETE FILES"); final PipedWriter pipeWriter = new PipedWriter(pipeReader);
}
new Thread( // Backup data from source database in script form.
new Runnable() { // Start writing to pipe writer in separate thread.
@Override final ResultSet rs = statSource.executeQuery("SCRIPT");
public void run() {
try { // Delete the target database first.
while (rs.next()) { try (Connection connTarget = DriverManager.getConnection(
pipeWriter.write(rs.getString(1) + "\n"); urlTarget + ";CLUSTER=''", user, password);
} Statement statTarget = connTarget.createStatement())
} catch (SQLException ex) { {
throw new IllegalStateException("Producing script from the source DB is failing.", ex); statTarget.execute("DROP ALL OBJECTS DELETE FILES");
} catch (IOException ex) { }
throw new IllegalStateException("Producing script from the source DB is failing.", ex);
} finally { new Thread(
IOUtils.closeSilently(pipeWriter); new Runnable() {
@Override
public void run() {
try {
while (rs.next()) {
pipeWriter.write(rs.getString(1) + "\n");
} }
} catch (SQLException ex) {
throw new IllegalStateException("Producing script from the source DB is failing.", ex);
} catch (IOException ex) {
throw new IllegalStateException("Producing script from the source DB is failing.", ex);
} finally {
IOUtils.closeSilently(pipeWriter);
} }
} }
).start();
// Read data from pipe reader, restore on target.
try (Connection connTarget = DriverManager.getConnection(
urlTarget, user, password);
Statement statTarget = connTarget.createStatement())
{
RunScript.execute(connTarget, pipeReader);
// set the cluster to the serverList on both databases
statSource.executeUpdate("SET CLUSTER '" + serverList + "'");
statTarget.executeUpdate("SET CLUSTER '" + serverList + "'");
} }
} catch (IOException ex) { ).start();
throw new SQLException(ex);
} finally { // Read data from pipe reader, restore on target.
// switch back to the regular mode try (Connection connTarget = DriverManager.getConnection(
statSource.execute("SET EXCLUSIVE FALSE"); urlTarget, user, password);
Statement statTarget = connTarget.createStatement())
{
RunScript.execute(connTarget, pipeReader);
// set the cluster to the serverList on both databases
statSource.executeUpdate("SET CLUSTER '" + serverList + "'");
statTarget.executeUpdate("SET CLUSTER '" + serverList + "'");
} }
} catch (IOException ex) {
throw new SQLException(ex);
} }
} }
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论