实现方法
- 通过ADO.NET SQLBulkCopy 方式
- 通过JDBC SQLServerBulkCopy 方式
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setCheckConstraints(true);
测试时,请用Microsoft JDBC Drivers 6.0 的sqljdbc41.jar,sqljdbc4.jar及更老版本没有SQLServerBulkCopy 实现。
例如: 将本地的一个大表通过SQLServerBulkCopy方式导入到RDS的实例中
import java.sql.*;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
public class Program {
public static void main(String[] args)
{
String sourceConnectionString = "jdbc:sqlserver://localhost:1433;" +
"databaseName=testdb;user=****;password=****";
String destConnectionString = "jdbc:sqlserver://*****.sqlserver.rds.aliyuncs.com:3433;" +
"databaseName=testdb;user=****;password=**** ";
try
{
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
try (Connection sourceConnection =
DriverManager.getConnection(sourceConnectionString))
{
try (Statement stmt = sourceConnection.createStatement())
{
try (ResultSet rsSourceData = stmt.executeQuery(
" SELECT top 1000000 " +
"[PersonType],[NameStyle],[Title],[FirstName],[MiddleName],[LastName] ," +
"[Suffix],[EmailPromotion],[AdditionalContactInfo]," +
"[Demographics],NULL as rowguid,[ModifiedDate] " +
try (Connection destinationConnection = DriverManager.getConnection(destConnectionString))
{
Statement stmt1 = destinationConnection.createStatement();
long countStart = 0;
try (ResultSet rsRowCount = stmt1.executeQuery(
"SELECT COUNT(*) FROM dbo.Person;"))
{
rsRowCount.next();
countStart = rsRowCount.getInt(1);
System.out.println("Starting row count = " + countStart);
}
try (SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(destinationConnection))
{
SQLServerBulkCopyOptions copyOptions = new SQLServerBulkCopyOptions();
copyOptions.setKeepIdentity(true);
copyOptions.setBatchSize(2000);
copyOptions.setBulkCopyTimeout(5000);
//this is importance setting
copyOptions.setCheckConstraints(true);
bulkCopy.setBulkCopyOptions(copyOptions);
bulkCopy.setDestinationTableName("dbo.Person");
bulkCopy.addColumnMapping("PersonType", "PersonType");
bulkCopy.addColumnMapping("NameStyle", "NameStyle");
bulkCopy.addColumnMapping("Title", "Title");
bulkCopy.addColumnMapping("FirstName", "FirstName");
bulkCopy.addColumnMapping("MiddleName", "MiddleName");
bulkCopy.addColumnMapping("LastName", "LastName");
bulkCopy.addColumnMapping("Suffix", "Suffix");
bulkCopy.addColumnMapping("EmailPromotion", "EmailPromotion");
bulkCopy.addColumnMapping("AdditionalContactInfo", "AdditionalContactInfo");
bulkCopy.addColumnMapping("rowguid", "rowguid");
try
{
bulkCopy.writeToServer(rsSourceData);
}
catch (Exception e)
{
e.printStackTrace();
}
try (ResultSet rsRowCount = stmt1.executeQuery(
"SELECT COUNT(*) FROM dbo.Person;"))
{
rsRowCount.next();
long countEnd = rsRowCount.getInt(1);
System.out.println("Ending row count = " + countEnd);
System.out.println((countEnd - countStart) + " rows were added.");
}
}
}
}
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
- 通过BCP方式
第一步:需要将数据BCP到本地
第二步:将导出的文件直接导入到RDS的实例中,但需要指定提示:/h “CHECK_CONSTRAINTS”
BCP testdb.dbo.person In "bcp_data" /C /N /q /k /h "CHECK_CONSTRAINTS" /U *** /P *** /b 500 /S "***.sqlserver.rds.aliyuncs.com,3433"
- 通过DTS/SSIS方式
第二种:直接使用SQL Server Business Intelligence Development Stuidio新建 SSIS包:
- 特别说明
第一种:
第二种:
- 总结