我在。NET本地SQL客户端之间用C#进行了一些测试,并与java中的JDBC驱动程序进行了比较,结果让我大吃一惊,我想我一定是在。NET代码中做错了什么。结果在一个有整数和文本字段的表中插入100万次,我在每次尝试之前清空它,运行为发布而构建的程序,并由它们自己运行。
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";
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 seconds\n", 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
com.ExecuteNonQuery();
}
com.Transaction.Commit();
VS
ps.addBatch();
}
ps.executeBatch();
ps.close();
dbCon.commit();
我看行刑的方法不同
问题内容: 我现在正在使用批处理: 我只是想知道上面的代码是否等效于下面的代码。如果没有,哪个更快? 问题答案: 首先,使用查询字符串连接,不仅会丢失PreparedStatement方法固有的类型转换,而且还容易受到数据库中正在执行的恶意代码的攻击。 其次,PreparedStatement先前已缓存在数据库本身中,与纯语句相比,这已经带来了很好的性能改进。
问题内容: 我正在尝试使用jdbc将一些数据插入到我的数据库中。我正在使用正确的表,数据库名称和参数。一切检查完毕。 代码 这是当我尝试运行它时给我的错误: 问题答案: 您在此行中有语法错误: 您缺少values子句的右括号。
问题内容: 我尝试将序列.nextval作为主键插入表中,Java中的sql是 但是,错误是 其他所有字段都是正确的,我认为这是顺序问题,这是正确的吗? 问题答案: 问题在于第一列是数字数据类型,但是您准备的语句正在提交字符串/ VARCHAR数据类型。该语句按原样运行,Oracle没有机会转换对nextval的使用来获取序列值。 这是通过Java的PreparedStatement语法的替代方法
主要内容:JDBC是什么?,使用JDBC前提条件,JDBC环境设置,创建JDBC应用程序,第一个JDBC 程序实例,JDBC数据类型,JDBC批量处理,JDBC数据流JDBC是什么? JDBC API是一个Java API,可以访问任何类型表列数据,特别是存储在关系数据库中的数据。JDBC代表Java数据库连接。 JDBC库中所包含的API通常与数据库使用于: 连接到数据库 创建SQL或MySQL语句 在数据库中执行SQL或MySQL查询 查看和修改数据库中的数据记录 使用JDBC前提条件 在学
主要内容:所需步骤,示例代码在本教程将演示如何在JDBC应用程序中向数据库的一个表中插入数据记录。 在执行以下示例之前,请确保您已经准备好以下操作: 具有数据库管理员权限,以在给定模式中数据库表中插入数据记录。 要执行以下示例,需要用实际用户名和密码替换这里用户名()和密码()。 MySQL或数据库已启动并运行。 所需步骤 使用JDBC应用程序向表中插入数据记录需要以下步骤: 导入包:需要包含包含数据库编程所需的JDBC类的