java - JDBC相比,java. NET SQL插入速度慢 ( JDBC 4x 更快)?

  显示原文与译文双语对照的内容
77 0

我在 C# 中的.NET 本机SQL客户机之间做了一些测试,并且与java中的JDBC驱动程序相比,我在. NET 代码中。在每次尝试之前,在一个包含整数和文本字段的表中插入 1百万个插入。

  • .NET 1行 1事务带有预处理语句,已经使用 159秒。
  • 使用微软的JDBC行的JDBC驱动程序,已经准备好的statments的事务数为4 秒。

的JDBC速度是 4倍

我有点惊讶,.NET 这么慢,真的希望我的.NET 代码出了一个大错误。所以,任何人都知道. NET 是什么错误或者为什么比jdbc慢得多?

.NET 代码:

SqlConnection con = new SqlConnection("Data Source=localhost;Initial Catalog=testameep;User Id=sa;Password=********;");
 con.Open();
 String tempString ="";
 for(int i = 0;i<400;i++)
 {
 tempString +="insert into test1 values (@A" + i.ToString() +",@B" + i.ToString() +" );";
 }
 SqlCommand com = new SqlCommand(tempString,con);
 for (int i = 0; i <400; i++)
 {
 com.Parameters.Add("@A" + i.ToString(), SqlDbType.Int);
 com.Parameters.Add("@B" + i.ToString(), SqlDbType.NVarChar,4000);
 }
 com.Transaction = con.BeginTransaction();
 DateTime start = DateTime.Now;
 com.Prepare();
 for(int i=0;i<2500;i++)
 {
 for (int j=0;j<800;j+=2)
 {
 com.Parameters[j].Value = i;
 com.Parameters[j + 1].Value ="test";
 }
 com.ExecuteNonQuery();
 }
 com.Transaction.Commit();
 label1.Text ="Query took:" + (DateTime.Now - start).TotalMilliseconds +" ms";

Java代码:

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver" );
 String dbURL ="jdbc:sqlserver://localhost;databaseName=testameep;user=sa;password=*******";
 Connection dbCon = DriverManager.getConnection( dbURL,"sa","*******" );
 dbCon.setAutoCommit( false );
 String tempString ="";
 for(int i = 0;i<400;i++)
 {
 tempString +="insert into test1 values (?,?);";
 }
 System.out.println("Query start");
 long start = System.currentTimeMillis();
 PreparedStatement ps = dbCon.prepareStatement(tempString);
 for(int i=0;i<2500;i++)
 {
 for (int j=1;j<800;j+=2)
 {
 ps.setInt(j, i);
 ps.setString( j+1,"test");
 }
 ps.executeUpdate();
//ps.addBatch();
 }
//This gave the same speed/result as using ps.executeUpdate();
//ps.executeBatch();
 ps.close();
 dbCon.commit();
 double total = (double)(System.currentTimeMillis() - start)/1000.0;
 System.out.printf("Query stop: %f secondsn", total);

更新:SQL分析器结果. NET:

--Creating the prepared statement. NET
 declare @p1 int
 set @p1=1
 exec sp_prepexec @p1 output,N'@A0 int,@B0 nvarchar(4000),@A1 int,@B1 nvarchar(4000),@A2 int,@B2 nvarchar(4000),@A3 int,@B3 nvarchar(4000),@A4 int,@B4 nvarchar(4000),@A5 int,...(continues)
select @p1
--Inserting rows. NET
exec sp_execute 1,@A0=4,@B0='test',@A1=4,@B1='test',@A2=4,@B2='test',@A3=4,@B3='test',@A4=4,@B4='test',@A5=4,@B5='test',@A6=4,@B6='test',@A7=4,@B7='test',@A8=4,@B8='test',@A9=4,...(continues)
...
2500 rows

SQL事件探查器结果 JDBC:

--Creating the prepared statment JDBC
declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P0 int,@P1 nvarchar(4000),@P2 int,@P3 nvarchar(4000),@P4 int,@P5 nvarchar(4000),@P6 int,@P7 nvarchar(4000),@P8 int,@P9 nvarchar(4000),@P10 int,... (continues)
select @p1
--Inserting rows JDBC
exec sp_execute 1,5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5,N'test',5...(continues)
...
2500 rows
时间:原作者:0个回答

84 3
 com.ExecuteNonQuery(); 
 } 
 com.Transaction.Commit(); 

vs

 ps.addBatch(); 
 } 
 ps.executeBatch(); 
 ps.close(); 
 dbCon.commit(); 

执行方法对我来说是 diffent

原作者:
...