您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

[转]SQL Server 高性能写入的一些总结

2024/5/10 0:27:07发布16次查看
1.1.1 摘要 在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。 本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的sql代码
1.1.1 摘要
在开发过程中,我们不时会遇到系统性能瓶颈问题,而引起这一问题原因可以很多,有可能是代码不够高效、有可能是硬件或网络问题,也有可能是数据库设计的问题。
本篇博文将针对一些常用的数据库性能调休方法进行介绍,而且,为了编写高效的sql代码,我们需要掌握一些基本代码优化的技巧,所以,我们将从一些基本优化技巧进行介绍。
本文目录1.1.2 正文假设,我们要设计一个博客系统,其中包含一个用户表(user),它用来存储用户的账户名、密码、显示名称和注册日期等信息。
由于时间的关系,我们已经把user表设计好了,它包括账户名、密码(注意:这里没有考虑隐私信息的加密存储)、显示名称和注册日期等,具体设计如下:
-- =============================================-- author:jkhuang-- create date: 7/8/2012-- description: a table stores the user information.-- =============================================create table [dbo].[jk_users](-- this is the reference to users table, it is primary key.[id] [bigint] identity(1,1) not null,[user_login] [varchar](60) not null,[user_pass] [varchar](64) not null,[user_nicename] [varchar](50) not null,[user_email] [varchar](100) not null,[user_url] [varchar](100) not null,-- this field get the default from function getdate().[user_registered] [datetime] ()),[user_activation_key] [varchar](60) not null,[user_status] [int] 0)),[display_name] [varchar](250) not null)
图1 users表设计上面,我们定义了users表,它包含账户名、密码、显示名称和注册日期等10个字段,其中,id是一个自增的主键,user_resistered用来记录用户的注册时间,它设置了默认值getdate()。
接下来,我们将通过客户端代码实现数据存储到users表中,香港服务器租用,具体的代码如下:
//// creates a database connection.var conn = new sqlconnection(configurationmanager.connectionstrings[sqlconn1].tostring());conn.open();//// this is a massive sql injection vulnerability, //// don't ever write your own sql statements with string formatting!string sql = string.format(@insert into jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key)values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}'),userlogin, userpass, usernicename, useremail, userstatus, displayname, userurl, useractivationkey);var cmd = new sqlcommand(sql, conn);cmd.executenonquery();//// because this call to close() is not wrapped in a try/catch/finally clause, //// it could be missed if an exception occurs above. don't do this!conn.close();代码中的问题上面,我们使用再普通不过的ado.net方式实现数据写入功能,但大家是否发现代码存在问题或可以改进的地方呢?
首先,我们在客户端代码中,创建一个数据库连接,它需要占用一定的系统资源,当操作完毕之后我们需要释放占用的系统资源,服务器空间,当然,我们可以手动释放资源,具体实现如下:
//// creates a database connection.var conn = new sqlconnection(configurationmanager.connectionstrings[sqlconn1].tostring());conn.open();//// this is a massive sql injection vulnerability, //// don't ever write your own sql statements with string formatting!string sql = string.format(@insert into jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key)values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}'),userlogin, userpass, usernicename, useremail, userstatus, displayname, userurl, useractivationkey);var cmd = new sqlcommand(sql, conn);cmd.executenonquery();//// if throws an exception on cmd dispose.cmd.dispose();//// conn can't be disposed.conn.close();conn.dispose();假如,在释放sqlcommand资源时抛出异常,那么在它后面的资源sqlconnection将得不到释放。我们仔细想想当发生异常时,可以通过try/catch捕获异常,所以无论是否发生异常都可以使用finally检查资源是否已经释放了,具体实现如下:
sqlcommand cmd = null;sqlconnection conn = null;try{//// creates a database connection.conn = new sqlconnection(configurationmanager.connectionstrings[sqlconn1].tostring());conn.open();//// this is a massive sql injection vulnerability,//// don't ever write your own sql statements with string formatting!string sql = string.format(@insert into jk_users (user_login, user_pass, user_nicename, user_email, user_status,display_name, user_url, user_activation_key)values ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}', '{7}'),userlogin, userpass, usernicename, useremail, userstatus, displayname, userurl, useractivationkey);cmd = new sqlcommand(sql, conn);cmd.executenonquery();}finally{//// regardless of whether there is an exception,//// we will dispose the resource.if (cmd != null) cmd.dispose();if (conn != null) conn.dispose();}通过上面的finally方式处理了异常情况是很普遍的,但为了更安全释放资源,使得我们增加了finally和if语句,那么是否有更简洁的方法实现资源的安全释放呢?
其实,我们可以使用using语句实现资源的释放,具体实现如下:
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product