首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

大家看看这种单态模式能行吗?该怎么解决

2012-03-09 
大家看看这种单态模式能行吗?usingSystemusingSystem.Collections.GenericusingSystem.TextusingSystem

大家看看这种单态模式能行吗?
using   System;
using   System.Collections.Generic;
using   System.Text;
using   System.Data;
using   System.Data.SqlClient;

namespace   Common
{
        public   class   DBCom
        {
                //取得一个数据库的连接
                public   static   SqlConnection   GetConnection()
                {
                        SqlConnection   sqlconn   =   new   SqlConnection();
                        try
                        {
                                sqlconn.ConnectionString   =   System.Configuration.ConfigurationManager.ConnectionStrings[1].ConnectionString;
                                return   sqlconn;
                               
                        }
                        catch(SqlException   e)
                        {
                                System.Console.WriteLine(   e.Message.ToString());
                                return   null;
                        }
                }

                //========================================================================

                //执行sql语句返回所影响的行数
                public   static   int   ExecuteSql(string   sql)
                {
                        SqlConnection   conn   =   DBCom.GetConnection();
                        SqlCommand   cmd   =   conn.CreateCommand();
                        cmd.CommandText   =   sql.Trim();
                        try
                        {
                                conn.Open();
                                int   count   =   cmd.ExecuteNonQuery();
                                return   count;


                        }
                        catch(SqlException   ex)
                        {
                                System.Console.WriteLine(ex.Message.ToString());
                                return   0;
                        }
                }

                //执行存储过程
                public   static   int   ExecuteProc(string   procName,   SqlParameter[]   sp)
                {
                        SqlConnection   conn   =   DBCom.GetConnection();
                        conn.Open();
                        SqlCommand   cmd   =   conn.CreateCommand();
                        cmd.CommandText   =   procName.Trim();
                        cmd.CommandType   =   CommandType.StoredProcedure;

                        foreach   (SqlParameter   s   in   sp)
                        {
                                cmd.Parameters.Add(s);
                        }

                        try
                        {
                                int   i   =   cmd.ExecuteNonQuery();
                                conn.Close();
                                return   i;
                        }
                        catch   (System.Exception   ex)
                        {
                                System.Console.WriteLine(ex.Message.ToString());
                                return   0;
                        }
                }

                //==============================================================================



                //根据sql   返回数据
                public   static   SqlDataReader   GetDataReader(string   sql)
                {
                        SqlConnection   conn   =   DBCom.GetConnection();
                        SqlCommand   cmd   =   conn.CreateCommand();
                        cmd.CommandText   =   sql.Trim();
                        try
                        {
                                conn.Open();
                                SqlDataReader   dr   =   cmd.ExecuteReader(System.Data.CommandBehavior.CloseConnection);
                                return   dr;
                        }
                        catch   (SqlException   ex)
                        {
                                System.Console.WriteLine(ex.Message.ToString());
                                return   null;
                        }
                }

                //===========================================================================

                public   static   DataSet   GetDataSet(string   Sql,   string   TableName)
                {
                        SqlConnection   conn   =   DBCom.GetConnection();
                        try
                        {
                                conn.Open();
                                SqlDataAdapter   adapter   =   new   SqlDataAdapter(Sql,   conn);
                                DataSet   ds   =   new   DataSet();
                                adapter.Fill(ds,   TableName);
                                conn.Close();


                                return   ds;
                        }
                        catch   (SqlException   ex)
                        {
                                System.Console.WriteLine(ex.Message.ToString());
                                return   null;
                        }
                }
             
                //通过存储过程返回   数据集
                public   static   DataSet   GetDataSet(string   procname,   SqlParameter[]   sp,   string   tableName)
                {
                        SqlConnection   conn   =   DBCom.GetConnection();
                        SqlCommand   cmd   =   new   SqlCommand();
                        SqlDataAdapter   adapter   =   new   SqlDataAdapter();
                        DataSet   ds   =   new   DataSet();

                        cmd.CommandType   =   CommandType.StoredProcedure;
                        cmd.CommandText   =   procname.Trim();

                        try
                        {
                                conn.Open();
                                cmd.Connection   =   conn;
                                foreach   (SqlParameter   p   in   sp)
                                {
                                        if   (p   ==   null)
                                        {
                                                break;
                                        }
                                        else


                                        {
                                                cmd.Parameters.Add(p);
                                        }
                                       
                                }

                                cmd.ExecuteNonQuery();
                                adapter.SelectCommand   =   cmd;
                                adapter.Fill(ds,   tableName);
                                conn.Close();
                                return   ds;
                        }
                        catch(SqlException   ex)
                        {
                                System.Console.WriteLine(ex.Message.ToString());
                                return   null;
                        }
                }

        }
}
=====================
以上的一些静态方法共用起来会不会产生冲突

[解决办法]
不好意思,粘贴有点错误,应该这样:
应该这样:
public class DBCom
{
private static DBCom instance;

public static DBCom GetInstance()
{
if ( instance == null )
{
instance = new DBCom();
}
return instance;
}
....

}


把你的初始化SqlConnection的那些东西放到构造函数中..

使用时用 DBCom dbc DBCom.GetInstance();

dbc.....即可正常使用该类,保证只有一个实例..

[解决办法]
两个用户一般不能并发使用一个数据库连接
如果有大量并发的情况,只有一个连接是不可行的

可能会同时打开十几个连接(SqlConnection对象)
默认连接池最大数是100
当连接池中没有可用连接时(全部被占用),就会打开新的连接
[解决办法]
可能会同时打开几十个连接(SqlConnection对象)
[解决办法]
SqlConnection conn=new SqlConnection ();

连接池也会打开多个连接吗?

如果是这样的话,那么编程的时候不就只要一个 静态公用的 SqlConnection 对象不就行了?
___________________________________________________________________________________

连接池是公用的,
你在一个页面的某段代码中打开一个连接
但是这一个页面可能被多个用户同时访问,
页面也不止这一个
页面访问说白了,是多线程的(使用线程池)


同时只有一个可用连接,多个线程被阻塞,你觉得可行吗?
[解决办法]
数据库访问是同步的,只有得到这一步的结果,才会继续向下运行
但数据查询是需要时间的~
[解决办法]
Bomb_Leo(爆破雷),你说最好不要使用Static方法,不安全,多人并发时,调用会出错滴。
根据是什么啊,说说看啊
[解决办法]
楼主 我猜测你想要得单件大概是下面这个样子的
public DBCon
{
private DBCon(){}

private static SqlConnection conn = null;

public static SqlConnection GetConn()
{
if( conn == null )
{
conn = new SqlConnection();
}
return conn;
}
}

但是这个设计在并发上有很多的缺陷 甚至可以说是个错误 他不仅仅不能提高效率 反倒很多时候得不偿失

简单来说.当一个connection没有执行完的时候,另外一个connection的请求就可以让你的程序挂掉,你的sqlserver将会被lock.如果你使用同步 lock( this )~~~~~~~~来解决,会使你的程序速度变慢

你可以参考一些 < <java与模式> > 中的单件模式。这本书中对你的这个问题有很深入的讲解。


完全没有必要只是用一个connection,db会建立一个connection的池来保证多个connection的效率问题。



[解决办法]
我理解的单态是这样的:
public class DBCom
{
private static DBCom instance;

public static DBCom GetInstance()
{
if ( instance == null )
{
instance = new DBCom();
}
return instance;
}
....

}

所谓的单态是保证DBCom只有一个实例,这个单态不是指SqlConnection只有一个连接 ,但具体有多少个连接由DBCom来控制(上面的方法确实有点缺陷,没有lock对象,可能会有点问题),用户访问数据库的方式都是
DBCom.CreateInstance().ExecXXX()....

[解决办法]
.NET的单件模式实际上有许多人都谈到过,比如蝈蝈俊.NET的http://blog.joycode.com/ghj/archive/2004/08/24/31512.aspx以及Chainet的http://www.cnblogs.com/chainet/archive/2004/08/13/33019.html;我所说用Static方法不安全其实也有误,应该是说在单件模式下使用静态函数处理多进程并发会有问题。
以下引用至“.NET设计模式--单例的深入研究”(http://www.cnblogs.com/william_fire/articles/162485.html)
因为在MSDN中的文章 < <检查表:托管代码的安全检查> > 中, "托管代码检查指南--> 线程处理 "里明确指出了“在多线程应用程序代码的静态类构造函数中,对线程进行同步”及“在静态类构造函数中,对线程进行同步。”两条检查规范,可见,CLR并没有对静态构造函数在多线程环境下进行自动地同步处理。因为.NET中的静态实例的处理,不是在软件启动时进行处理,而是要当包含静态访问的字段、方法、属性或其它什么静态的玩意的类被第一次访问时,在构建实例之前进行创建,也就是说,是临时发觉要用之前才进行创建的。这意味着,如果.NET的框架没有提供一个静态函数初始化的线程安全的处理的情况下,该初始化是并非线程安全的。即使是用了readonly也无济于事:当构建此实例的时间超出了实例创建出来并在框架中进行注册的所消耗的时间时,多线程中假设两个线程同时并发,第一个线程在系统进行静态实例创建时,第二线程也对此类访问,中间的时间差造成了CLR并不知道第一个静态实例正在创建中,那么就会发生了再次进行静态实例创建,这就会造成两个实例的出现,但因为声明了readonly,结果就是会抛出一个异常。


热点排行