初学asp.net,一个数据库连接的方法?(急)
小弟初学asp.net,之前一直在用asp,看了几本书后,发现在进行表操作时总是需要进行数据库的连接,这样不是浪费吗?听说连接池可以解决上述问题,可不知如何写?望能提供源码参考,谢谢!或有其它方法也好。 问题点数:0、回复次数:7Top
1 楼lr2651(戎 The Two Towers)回复于 2005-06-01 10:51:07 得分 0
/// <summary>
/// 建立数据库连接。
/// </summary>
public void Open()
{
if (conn == null)
{
conn = new OleDbConnection(System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"]);
conn.Open();
}
}
建立这么个公有事件,放到一个类文件中,每次直接调用 Open();就可以了。Top
2 楼Nils(睡瞌睡等机会)回复于 2005-06-01 11:21:30 得分 0
池连接可以显著提高应用程序的性能和可缩放性。SQL Server .NET 数据提供程序提供了自动为您的 ADO.NET 客户端应用程序管理连接池的功能。您也可以提供几个连接字符串修饰符来控制连接池行为(请参阅本主题后面部分的“使用连接字符串关键字控制连接池”)。
池的创建和分配
当连接打开时,将根据一种精确的匹配算法来创建连接池,该算法会使连接池与连接中的字符串相关联。每个连接池都与一个不同的连接字符串相关联。当新连接打开时,如果连接字符串不精确匹配现有池,则将创建一个新池。
在以下示例中,将创建三个新的 SqlConnection 对象,但只需要使用两个连接池来管理这些对象。请注意,第一个和第二个连接字符串的差异在于为 Initial Catalog 分配的值。
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// Pool A is created.
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=pubs";
conn.Open();
// Pool B is created because the connection strings differ.
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Integrated Security=SSPI;Initial Catalog=northwind";
conn.Open();
// The connection string matches pool A.
连接池一旦创建,直到活动进程终止时才会被毁坏。非活动或空池的维护只需要最少的系统开销。
连接的添加
连接池是为每个唯一的连接字符串创建的。当创建一个池后,将创建多个连接对象并将其添加到该池中,以满足最小池大小的要求。连接将根据需要添加到池中,直至达到最大池大小。
当请求 SqlConnection 对象时,如果存在可用的连接,则将从池中获取该对象。若要成为可用连接,该连接当前必须未被使用,具有匹配的事务上下文或者不与任何事务上下文相关联,并且具有与服务器的有效链接。
如果已达到最大池大小且不存在可用的连接,则该请求将会排队。当连接被释放回池中时,对象池管理程序将重新分配连接,以满足这些请求。如果在可获取连接对象之前超时期限已过(由 Connect Timeout 连接字符串属性来决定),则将出错。
警告 每次使用完 Connection 后都必须将其关闭。这可以使用 Connection 对象的 Close 或 Dispose 方法来实现。未显式关闭的连接将不会添加或返回到池中。
连接的移除
如果连接生存期已过或者池管理程序检测到与服务器的连接已被断开,则对象池管理程序将从池中移除该连接。请注意,只有在尝试与服务器进行通讯后,才可以检测到这种情况。如果发现某连接不再连接到服务器,则会将其标记为无效。对象池管理程序会定期扫描连接池,以查找已被释放到池中并标记为无效的对象。找到后,这些连接将被永久移除。
如果与已消失的服务器的连接还存在,那么即使对象池管理程序未检测到断开的连接并将其标记为无效,仍有可能将此连接从池中取出。当发生这种情况时,将生成异常。但是,为了将该连接释放回池中,仍必须将其关闭。
事务支持
连接是根据事务上下文来从池中取出并进行分配的。请求线程和所分配的连接的上下文必须匹配。因此,每个连接池实际上又分为不具有关联事务上下文的连接以及 N 个各自包含与一个特定事务上下文的连接的子部分。
当连接关闭时,它将被释放回池中,并根据其事务上下文放入相应的子部分。因此,即使分布式事务仍然挂起,仍可以关闭该连接而不会生成错误。这样,您就可以在随后提交或中止分布式事务。
使用连接字符串关键字控制连接池
SQLConnection 对象的 ConnectionString 属性支持连接字符串键/值对,这些键/值对可用于调整连接池逻辑的行为。
下表描述了可用于调整连接池行为的 ConnectionString 值。
名称 默认值 说明
Connection Lifetime 0 当连接返回到池中时,将对它的创建时间和当前时间进行比较,如果时间间隔超过由 Connection Lifetime 指定的值(以秒为单位),则会毁坏该连接。在聚集配置中可以使用它来强制在运行服务器和刚联机的服务器之间达到负载平衡。
如果值为零 (0),则将使池连接具有最大的超时期限。
Connection Reset 'true' 确定在从池中移除数据库连接时是否将其重置。对于 Microsoft SQL Server 版本 7.0,如果设置为 false,将避免在获取连接时经历一个额外的往返行程,但必须注意的是连接状态(如数据库上下文)不会被重置。
Enlist 'true' 当为 true 时,如果存在事务上下文,池管理程序将自动在创建线程的当前事务上下文中登记连接。
Max Pool Size 100 池中允许的最大连接数。
Min Pool Size 0 池中维护的最小连接数。
Pooling 'true' 当为 true 时,将从相应的池中取出连接,或者在必要时创建连接并将其添加到相应的池中。
连接池的性能计数器
SQL Server .NET 数据提供程序添加了几个性能计数器,它们将使您能够微调连接池特性,检测与失败的连接尝试相关的间歇性问题,并检测与对 SQL Server 的超时请求相关的问题。
下表列出了可以在“.NET CLR 数据”性能对象下的“性能监视器”中访问的连接池计数器。
计数器 说明
SqlClient:当前池连接和非池连接的数目 当前池连接或非池连接的数目。
SqlClient:当前池连接的数目 当前所有池中与特定进程关联的连接的数目。
SqlClient:当前连接池的数目 当前与特定进程关联的池的数目。
SqlClient:池连接数的峰值 自特定进程开始以来所有池中的连接数峰值。请注意:此计数器只有在与特定进程实例关联时才可用。_Global 实例始终返回 0。
SqlClient:失败连接的总数 打开连接的尝试因任何原因而失败的总次数。Top
3 楼dcren118(酒仙)回复于 2005-06-01 11:28:38 得分 0
数据库连接 用完了马上就要关闭!
这样 才是最优化的方法!
Top
4 楼dragonwzw(龙的传人)回复于 2005-06-01 11:31:28 得分 0
连接Oracle数据库
using System.Data.OracleClient;
.....
string strConn="Data Source=webdb;User Id=shendun;Password=za887nimdawzwmgf1dsd;";
OracleConnection conn=new OracleConnection(strConn);
conn.open();Top
5 楼meixiaofeng(yesmsn)回复于 2005-06-01 11:47:44 得分 0
自带Top
6 楼50277(柳影随风)回复于 2005-06-01 13:05:57 得分 0
/// <summary>
/// 得到DataTable对象
/// </summary>
/// <param name="strSql">SQL语句</param>
/// <returns>DataTable</returns>
public DataTable GetDataTable(string strSql)
{
GPRS.GPRSConfig.GPRSConfig config=new GPRS.GPRSConfig.GPRSConfig();
SqlConnection Cnn=null;
SqlCommand command=null;
SqlDataAdapter dataA=new SqlDataAdapter();
DataSet data=new DataSet();
try
{
Cnn=new SqlConnection(config.getConnectionString());
if (Cnn.State !=ConnectionState.Open)
{
Cnn.Open();
}
command=new SqlCommand(strSql,Cnn);
command.CommandType =CommandType.Text;
dataA.SelectCommand =command;
dataA.Fill(data);
return data.Tables[0];
}
catch (Exception e)
{
throw e;
}
finally
{
try
{
dataA.Dispose();
command.Dispose();
Cnn.Close();
Cnn.Dispose();
Cnn=null;
}
catch
{}
}
}
////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// 得到数据库连接字符串
/// </summary>
/// <returns>返回数据库连接字符串</returns>
private string getXMLString(int connetionSign)
{
DataSet dataset=new DataSet();
DataTable tab=new DataTable();
string CNNstring="";
//string path=System.Environment.CurrentDirectory;
string dbName="";
if (System.Web.HttpContext.Current.Session["GPRSDataBaseName"]!=null)
{
dbName=System.Web.HttpContext.Current.Session["GPRSDataBaseName"].ToString();
}
string path=System.Web.HttpContext.Current.Request.PhysicalApplicationPath;
path+="config\\datasource.xml";
dataset.ReadXml(path);
DataRow row=dataset.Tables[0].Rows[0];
CNNstring="server="+row["server"].ToString()+";";
CNNstring+="User ID="+row["user"].ToString()+";";
CNNstring+="Password="+row["password"].ToString()+";";
if (connetionSign==0)//默认链接
{
CNNstring+="database="+row["database"].ToString()+";Connection Reset=FALSE";
}
else
{
if (dbName!="")
{
CNNstring+="database="+dbName+";Connection Reset=FALSE";
}
else
{
CNNstring+="database="+row["database"].ToString()+";Connection Reset=FALSE";
}
}
dataset.Dispose();
dataset=null;
dbConnectionString=CNNstring;
return CNNstring;
}
///////////////////////////////////////////////////////////////////////////////////
XML文件的内容 datasource.xml 放在自己的config文件夹里
<?xml version="1.0" standalone="yes"?>
<JY_GPRS>
<server>数据库地址</server>
<database>数据库名称</database>
<user>用户名</user>
<password>密码</password>
<connectiontimeout>10</connectiontimeout>
<connectionlifetime>10</connectionlifetime>
<maxpoolsize>200</maxpoolsize>
<minpoolsize>20</minpoolsize>
<pooling>true</pooling>
<currentDataBase>数据库名称</currentDataBase>
</JY_GPRS>
///////////////////////////////////////////////////
string strSql="select * from youTable";
DataGrid.DataSource=GetDataTable(strSql);
DataGrid.DataBind();
///////////////////////////////////////////Top
7 楼hchxxzx(NET?摸到一点门槛)回复于 2005-06-01 13:10:10 得分 0
连接池,只要你有打开数据库连接,系统就会自动将你的请求暂存在连接池里面,如果在一定时间里面,还有人一请求相同的连接,那么它就直接复用,因此速度快,并不是说有什么直接使用连接池的方法.
你只要在需要的时候,才打开数据库,而在使用完毕时,立即关闭数据库,就可以了.Top




