Tag: 连接池

连接池

我有以下代码,如果我最后使用conn == null,我仍然使用连接池? 我知道关闭连接是一个好习惯但是如何处理整个连接对象呢? public void ExecuteNonQuery(SqlCommand Cmd) { //========== Connection ==========// SqlConnection Conn = new SqlConnection(strConStr); try { //========== Open Connection ==========// Conn.Open(); //========== Execute Command ==========// Cmd.Connection = Conn; Cmd.CommandTimeout = 180; Cmd.ExecuteNonQuery(); } catch (Exception Exc) { throw Exc; } finally { //======== Closing Connection ========// if (Conn.State == ConnectionState.Open) { Conn.Close(); […]

SqlConnection vs Sql Session。 他们的生命一致吗?

我想为我的c# app中的某些进程应用一些sql-session级别设置。 例如,我想将某些后台进程的DEADLOCK_PRIORITY设置为LOW 。 问题是: 如果我打开一个新的SQL连接,那会启动一个新的sql-session吗? sql-session会一直存在,直到连接关闭? 如果我在打开SqlConnection后立即应用我的设置,它们对于在同一个SqlConnection上下文中执行的所有查询是否有效? 连接池怎么样? 这可能是我的SET DEADLOCK_PRIORITY LOW设置将被我的系统中的其他进程(我不想要)重用,因为SqlConnection实际上没有关闭( asp.net连接池决定重用它)。 谢谢!

.NET CORE MySql MaxPoolSize未应用于

我们在RDS中托管了一个MySQl数据库。 创建MySQL连接时,似乎不应用最大池大小。 我们有一个看起来像这样的连接字符串 Server=myServer;Port=3306;Database=MyDatabase;User Id=MyUser;Password=MyPassword;ConnectionReset=True;pooling=true;minpoolsize=1;maxpoolsize=4;ConnectionLifeTime=30″ 我们在这里添加了最大池大小,但是我们的应用程序仍然保持着太多的连接。 我已经使用该命令在MySqlWorkbench中validation了这一点 select * FROM INFORMATION_SCHEMA.PROCESSLIST 我们正常地创建一个sql连接..我做错了什么? var connection = new MySql.Data.MySqlClient.MySqlConnection(_connectionString); connection.Open() 技术信息:MySql Server版本:5.7.16 MySqlConnector 🙁 Nuget Package) – > MySql.Data Version =“7.0.6-ir31” 更新: 在unit testing中执行此操作并并行打开MySQL连接时,一切似乎都很顺利。 但是,当Web请求通过ASP.NET Core进入时,似乎存在问题。

检测不可用的池化SqlConnections

当我尝试使用sp_setapprole在SqlConnection上设置应用程序角色时,我有时会在Windows事件日志中收到以下错误… 连接已被删除,因为打开它的主体随后假定了一个新的安全上下文,然后尝试在其模拟的安全上下文下重置连接。 不支持此方案。 请参阅联机丛书中的“模拟概述”。) …并在我的应用程序中抛出匹配的exception。 这些是池连接,有一段时间连接池与app角色不兼容 – 事实上,Microsoft的旧建议是禁用连接池 (!!)但是随着sp_unsetapprole的引入,它现在(理论上)可以在将连接返回池之前清理连接。 我相信这些错误发生在(由于未知原因)sp_unsetapprole在连接关闭并返回到连接池之前未在连接上运行时。 然后,当从池返回此连接时,sp_approle注定要失败。 我可以捕获并处理此exception,但我更愿意检测即将发生的故障并完全避免exception(以及事件日志中的消息)。 是否有可能在不引起exception的情况下检测问题? 欢迎提出想法或建议。

池中的连接耗尽

我有一个Web表单应用程序,它将在GridView中显示记录列表,通过选中多个复选框,您可以批量删除记录。 代码本身很简单: protected void btnDelete_Click(object sender, EventArgs e) { int i = 0; try { foreach (GridViewRow row in GridView1.Rows) { CheckBox cb = (CheckBox)row.FindControl(“ID”); if (cb != null && cb.Checked) { int profileID = Convert.ToInt32(GridView1.DataKeys[row.RowIndex].Value); Profile profile = new Profile(profileID); //instantiate profile profile.Delete(); //call delete method i++; } } if (i > 0) { […]

活动Azure Sql连接超出了连接池限制

我们的Azure SQL数据库性能会在很长一段时间内显着降低,我们会在生产中解决问题。 我们知道我们在其中一个表上有锁,但是这些锁不是死锁,它们是长锁,并且在一个小时左右的时间内性能恢复正常。 我们正试图找到关于如何获得这些长锁的所有可能场景(每个查询都超快,所有性能分析器都可以向我们展示导致长锁的原因)。 这个问题的原因如下图所示: Out连接池设置仅允许汇集200个连接。 大多数时候,我们与数据库有大约10-20个开放/池化连接。 然后突然有许多活动连接开始增长,并且池完全被占用。 虽然许多池化连接保持在200以下,但我们看到使用sp_who2的多个活动连接达到1.5k-2k连接(有时为4k-5k)。 我使用Azure门户监控工具构建了相同的图表。 它有不同的聚合期,但显示相同的问题: 我们使用的连接字符串: Data Source = [server] .database.windows.net; initial catalog = [database]; persist security info = True; user id = [user]; password = [password]; MultipleActiveResultSets = True; Connection Timeout = 30; Max Pool大小= 200;池=真;应用= [AppName的] 考虑到200个连接的连接池限制,这怎么可能? ps:没有周期性任务,长时间运行的查询或其他任何工具,我们检查sp_who2与sp_who2所有活动连接。

连接池比保持一个连接打开要慢

我观察到了我们创建的客户端应用程序中连接池性能的一个有趣行为。 当用户点击某个对象时,会从数据库中加载更多特定于对象的数据。 根据对象的不同,每次点击需要10到30个查询。 这是通过使用连接池完成的,并且每个查询都是从池中的新连接调度的,并且在查询运行后连接已关闭。 我已经分析了探查器中的查询以进行性能优化,并看到那里有很多审计登录/注销条目。 此外,尽管查询自己运行良好(仅索引搜索/扫描操作符),但性能并非最佳。 只是为了尝试它,我禁用了池并修改了代码以保持每个客户端应用程序的一个连接并重用它。 这使整个应用程序响应更快,并且所有审计登录/注销条目都从分析器中消失。 这怎么可能? 连接不应该保持打开状态,或者它们是否实际保持打开状态至少不会这么慢? 是否有可能我们使用SqlConnection类错误导致禁用池? 我已经阅读了有关池化的其他post,但没有找到任何关于池化连接和重用相同连接之间可感知的速度差异的信息。 SqlConnection con = new SqlConnection(_connectionString); 连接被切换到提供事务function的包装类Session。 class Session{ Session(connection); Abort(); Commit(); } 连接在Abort()和Commit()中关闭。 其中一个总是被称为。

管理SQL Server连接

SQL连接的最佳实践是什么? 目前我使用以下内容: using (SqlConnection sqlConn = new SqlConnection(CONNECTIONSTRING)) { sqlConn.Open(); // DB CODE GOES HERE } 我已经读过这是一种非常有效的SQL连接方式。 默认情况下,SQL池是活动的,因此我理解的是,当using代码结束时, SqlConnection对象被关闭并处理,但是与DB的实际连接被放入SQL连接池中。 我错了吗?

多租户:每个租户的单个数据库

我们正在开发一个多租户应用程序。 在架构方面,我们为业务逻辑设计了共享中间层,为每个租户设计了一个数据持久性数据库。 如果说,业务层将与每个租户的数据库服务器建立连接集(连接池)。 这意味着应用程序为每个租户维护单独的连接池。 如果我们期望大约5000个租户,那么此解决方案需要高资源利用率(每个租户的应用服务器和数据库服务器之间的连接),这会导致性能问题。 我们通过保持公共连接池来解决这个问题。 为了在不同的数据库中维护单个连接池,我们创建了一个名为“App-master”的新数据库。 现在,我们始终首先连接到“App-master”数据库,然后将数据库更改为特定于租户的数据库。 这解决了我们的连接池问题。 此解决方案与内部部署数据库服务器完美配合。 但它不适用于Azure Sql,因为它不支持更改数据库。 提前感谢建议如何维护连接池或更好的方法/最佳实践来处理此类多租户方案。

TransactionScope助手无故耗尽连接池 – 帮助?

前段时间我问了一个关于TransactionScope升级到MSDTC的问题,当时我还没想到。 ( 上一个问题 ) 简而言之,在SQL2005中,为了使用TransactionScope,您只能在TransactionScope的生命周期内实例化并打开一个SqlConnection。 使用SQL2008,您可以实例化多个SqlConnections,但在任何给定时间只能打开一个SqlConnections。 SQL2000将始终升级到DTC …我们的应用程序中不支持SQL2000,一个WinForms应用程序,BTW。 我们对单连接问题的解决方案是创建一个名为LocalTransactionScope(又名’LTS’)的TransactionScope助手类。 它包装了一个TransactionScope,最重要的是,它为我们的应用程序创建并维护了一个SqlConnection实例。 好消息是,它可以工作 – 我们可以在不同的代码片段中使用LTS,它们都加入了环境事务。 非常好。 问题是,创建的每个根 LTS实例都将创建并有效地从连接池中终止连接。 通过’有效杀死’我的意思是它将实例化一个SqlConnetion,它将打开一个新连接(无论出于何种原因,它永远不会重用来自池的连接),并且当该根LTS被释放时,它会关闭并处理SqlConnection,这是应该将连接释放回池中以便可以重复使用,但是,它显然永远不会被重用。 池膨胀直到最大化,然后在建立max-pool-size + 1连接时应用程序失败。 下面我附上了一个精简的LTS代码版本和一个示例控制台应用程序类,它将演示连接池耗尽。 要观察连接池膨胀,请使用SQL Server Managment Studio的“活动监视器”或此查询: SELECT DB_NAME(dbid) as ‘DB Name’, COUNT(dbid) as ‘Connections’ FROM sys.sysprocesses WITH (nolock) WHERE dbid > 0 GROUP BY dbid 我在这里附加LTS,以及一个示例控制台应用程序,您可以使用它来演示它将使用池中的连接并且永远不会重复使用也不会释放它们。 您需要为LTS添加对System.Transactions.dll的引用以进行编译。 注意事项:它是打开和关闭SqlConnection的根级LTS,它始终在池中打开一个新连接。 嵌套LTS实例没有区别,因为只有根LTS实例建立了SqlConnection。 如您所见,连接字符串始终相同,因此应重用连接。 是否有一些我们没有遇到的神秘条件导致连接不被重复使用? 除了彻底改变之外,还有其他解决办法吗? public sealed class LocalTransactionScope […]