首页 新闻 搜索 专区 学院

EFCore如何保持Connection为打开状态

0
悬赏园豆:10 [已解决问题] 解决于 2020-08-10 15:16

给EFCore添加日志后发现

每执行一次SQL, 它都会openning connection->opened->executing->executed->closing connection->closed

而有时候我希望能够保持长连接, 不要关闭

求教如何设置? 

-----

发现博友并没有看清楚我的题目...

1, EFCore

2, 保持Connection

我是通过日志来观察的.

那位让我看官网文档的朋友我真的刷过官网文档好几遍了不然也不会用日志不是吗?

------

把问题换个方式再表达下:

using(var context = new DbContext())

{

//query1

//query2

//query3

}

查看日志后发现:

[]opening connection to server xxx.xxx.xxx.xx

[]opened connection to server xxx.xxx.xxx.xx

[]executing query1

[]executed query1

[]closing ...

[]closed

[]opening connection to server xxx.xxx.xxx.xx

[]opened connection to server xxx.xxx.xxx.xx

[]executing query2

[]executed query2

[]closing ...

[]closed

[]opening connection to server xxx.xxx.xxx.xx

[]opened connection to server xxx.xxx.xxx.xx

[]executing query3

[]executed query3

[]closing ...

[]closed

然而我想要的是一次open 然后执行query1,2,3之后再close

至于使用contextpool, 也不是这回事, 我这例子里就只需要用到一个context所以不需要pool

不知道有没有方法可以设置, 非常感谢

陈惊蛰的主页 陈惊蛰 | 初学一级 | 园豆:150
提问于:2018-05-02 17:22

我用的是EF+MySql, 使用的时候忽略了一个问题, 没有在连接字符串配置pooling.
当时的项目很单纯就是只需要一个连接就可以了, 对那个项目来说ef没有什么优势, 最终我使用了dapper, 并用一个能在运行时拦截属性set的类库替换了ef的追踪功能.

陈惊蛰 3个月前
< >
分享
最佳答案
1

可以把数据库连接注入到上下文:

收获园豆:4
Doc.stu | 菜鸟二级 |园豆:206 | 2019-07-11 10:54

using (var conn = new SqlConnection("..."))
{
conn.Open();
using (var context = new BloggingContext(conn, contextOwnsConnection: false))
{
//Do your job....
}
}

Doc.stu | 园豆:206 (菜鸟二级) | 2019-07-11 10:57
其他回答(3)
0

来,首先学习一下EF CORE.

https://docs.microsoft.com/en-us/ef/core/

然后学习一下 ASP.NET CORE

https://docs.microsoft.com/en-us/ef/core/get-started/aspnetcore/  

 

最后,给我一个理由,谁告诉你保持长连接是个好习惯。

希望你能在上面的文章中找到答案,而不要听别人胡说八道。

收获园豆:4
爱编程的大叔 | 园豆:30743 (高人七级) | 2018-05-02 17:25

官网文档我翻过了, 既然提出这个问题自然是有需求, 如果您能帮我解决问题, 非常感谢.

我是来求解的, 不是来寻您的教训的.

😟

支持(0) 反对(0) 陈惊蛰 | 园豆:150 (初学一级) | 2018-05-02 17:26

@陈惊蛰: 看了补充说明,知道你在担心啥了,不用担心

These probably aren't _real_ logins and they are probably nothing to be worried about.  Just EF and .NET using pooled connections.

如果你非要担心的话,那你可以在Context的Constructor里面写这么一句

Database.Connection.Open()

当然,还是要提醒(不是教训)你,不要自己作死去做这种画蛇添足的事。

支持(0) 反对(1) 爱编程的大叔 | 园豆:30743 (高人七级) | 2018-05-03 09:39
0

用的什么框架,如果是efcore,修改addcontext<>为addcontextpoll<>

收获园豆:2
czd890 | 园豆:9531 (大侠五级) | 2018-05-02 17:30
0

试试这个方法,在 Startup 的 ConfigureServices 方法中创建 SqlConnection 然后注入给 DbContext

var conn = new SqlConnection(Configuration.GetConnectionString("conn"));
services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer(conn)
);
dudu | 园豆:38831 (高人七级) | 2018-05-02 18:35

实际使用就是这样注入的. 这个问题里我简化了应用场景. 

在一个action中有多次查询, 查看日志后发现这几个查询每次都是open connection再close...

asp.net core中的容器是action执行完会dispose, 所以我简化成一次using了.

本以为在DbContext dispose之前应该会保持连接, 可是看日志(Debug级)发现每次查询生成sql之后都是打开连接->查询->关闭连接. 不知道能否通过设置在DbContext dispose之前让它的Connection保持Open. 

支持(0) 反对(0) 陈惊蛰 | 园豆:150 (初学一级) | 2018-05-02 18:49

@陈惊蛰: 不知道你为什么有这个需求,close connection只是把connection放回连接池

支持(0) 反对(0) dudu | 园豆:38831 (高人七级) | 2018-05-02 19:08

@陈惊蛰: 或者试试版 DbContext 注册为单例

services.AddDbContext<MyDbContext>(options =>
    options.UseSqlServer(Configuration.GetConnectionString("conn")), ServiceLifetime.Singleton);
支持(0) 反对(0) dudu | 园豆:38831 (高人七级) | 2018-05-02 19:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册