简介:许多朋友询问Django如何解决慢速数据库的问题。本文的首席CTO笔记开始为您的参考做出详细的答案。我希望这对每个人都会有所帮助!让我们一起看看!
解决django“懒惰”的基本方法
现在,我们解决此问题的方法是“预载”。本质上,您要预先警告django orm,您必须一遍又一遍地告诉它相同的无聊指令。在上面的示例中,很容易添加此句子在DRF开始之前:
querySet = queryset.prefetch_reled('orders')
当DRF调用上述客户的相同序列化时,情况就是这样:
获取所有客户(执行两个回合数据库操作,第一个是获取客户,第二个是获得相关客户的所有相关顺序。)。
对于第一个客户,获取其订单(无需访问数据库,我们在上一步中获得了所需的数据)
对于第二个返回客户,获取订单(无需访问数据库)
对于第三个返回客户,获取订单(无需访问数据库)
对于第四个返回客户,获取订单(无需访问数据库)
对于第五返回客户,获取订单(无需访问数据库)
对于第六返回客户,获取订单(无需访问数据库)
您意识到您可以有很多客户,并且不再需要继续等待数据库。
实际上,在步骤1中请求Django Orm的“准备”,该步骤1可以在本地高速缓存数据中提供步骤2+所需的数据,并具有先前数据库,从本地缓存数据中读取数据基本上是瞬时的,因此我们有当我们有很多客户时,获得了巨大的性能加速。
解决Django REST框架的性能的标准化模式
我们已经确定了一种通用模式,可以优化Django REST框架的性能,也就是说,每当序列化查询嵌套字段时,我们添加了一个新的@StaticMethod,名为Setup_eager_loading,如下:
班级CobuliteRializer(Serializers.ModelSerializer):
orders = orderSerializer(许多= true,read_only = true)
def setup_eager_loading(cls,querySet):
“”“”执行不加载数据。“”“”“”“”“”“”
querySet = queryset.prefetch_reled('orders')
返回QuerySet
这样,无论您在何处使用此序列化,您只需要在调用serialization之前只调用setup_eager_loading,就像这样::
customer_qs = customer.objects.all()
customer_qs = cusiteerializer.setup_eager_loading(customer_qs)#设置急切的加载以避免n+1选择
post_data = cusiteerializer(customer_qs,多个= true).data。
或者,如果您有Apiview或Viewset,则可以在get_queryset方法中调用setup_eager_loading ::
def get_queryset(self):
querySet = cunituter.objects.all()
#设置急切的加载以避免n+1选择
querySet = self.get_serializer_class()。setup_eager_loading(querySet)
返回QuerySet
选择“开始”菜单→程序→[管理SQL Server 2008]→[SQL Server Management Studio]命令,打开[SQL Server Management Studio]窗口,然后使用Windows或SQL Server身份验证来建立连接。
在[对象资源管理器]窗口中展开服务器,然后选择[数据库]节点
右 - 单击[数据库]节点,从pop -up快捷方式菜单中选择[新数据库]命令。
执行上述操作后,[新数据库]对话框将弹出。对话框和左侧有3个选项,即[常规],[选项]和[文件组]。完成设置后这三个选项,数据库的创建已完成。
输入数据库的名称,以在[数据库名称]中创建一个新数据库。例如,这是“新数据库”。
在文本框中输入新数据库的所有者,例如sa.cording,以使用数据库,选择或禁用[全文索引]复选框。
在[数据库文件]列表中包括两行,一个是数据库文件,另一个是日记文件。ADD或通过单击下面的[add]和[删除]按钮删除数据库文件。
切换到[可选页面],您可以在其中设置数据库的排序规则,恢复模式,兼容性级别和其他属性。
切换到[文件组]页面,您可以在此处添加或删除文件组。
完成上述操作后,单击[确定]按钮以关闭[新数据库]对话框。在这一点上,成功创建了“新数据”数据库。可以在[Object Resource Manager中看到新构建的数据库] 窗户。
目前,将模型修改为Django 1.7的前提是您已经创建了模型并使用了SynCDB或迁移来创建相应的数据库表。然后修改模型,该模型不会修改为数据库表。,转到Django的不同版本的文档的相应版本,这不是相同的。
错误代码1045
访问用户'root'@'localhost'的访问被拒绝
(使用密码:是)
如果您的mysql也出现在上面,则此提示,
建议您一一阅读我的文章,并尝试根据以下方法解决问题。
这是MySQL数据库经常发生的问题。许多解决方案在互联网上流通。有些人确实可以根据这些方法解决问题。但是许多人无法根据这些方法解决问题!
这个中等原因是没有正确的药物!!!
Internet上的许多方法都没有明确指出MySQL的哪个版本,因此无法开出问题的问题。
如果发生此问题,可以通过停止/重新启动MySQL服务来解决。这是最简单的方法!对于那些不知道什么“停止/重新启动mysql服务”的人,
最简单的方法是重新启动服务器主机(即重新启动计算机)。
以上是方法a!(此方法适用于MySQL的任何版本)
以下是方法b :(方法仅适用于mysql4.0.26 !!!!(我估计,
4.0的其他版本也应该可用)))))))
有人在互联网上说,即更改root的密码。对于在Internet上循环的密码方法也是可行的。请参考以下内容:
修改DOS下的root密码:当然,如果您以后安装phpmyadmin,则可以修改密码并通过phpmyadmin进行修改
格式:mysqladmin -u用户名-P旧密码
新密码
示例:添加密码induecmblog扎根
首先输入CMD命令行,转移到MySQL目录中的BIN目录,然后键入以下命令
mysqladmin
-UROT密码Iduscmblog
注意:由于root在开始时没有密码,因此可以省略-P旧密码。
D:phpmysqlbinmysqladmin -uroot密码
返回汽车后,IdeaCMBlog设置为Idurecmblog
但是,请注意,以上方法仅适用于mySQL4.0.26
版本 !!!(我估计,其他版本的4.0也应该可以))))
方法C:
好的,如此多的酷刑,以上两种方法没有我自己测试,我对现实主义不承担任何责任!
现在,我将讨论我亲自尝试的方法:
顺便说一句,使用MySQL数据库的所有phps和网站都挂断了!无法打开它,
以及以下提示:
错误代码1045
访问被拒绝
用户'root'@'localhost'(使用密码:是)
一开始,我一直在寻找Google(我不喜欢Baidu!),),),
去寻找解决方案。看到很多东西后,我也参考了它。实际上,我无法解决问题。之后
解决方案不一定是一样的!记住 ...
我的mysql版本是:5.0.22
(MySQL- Essential-5.0.22-Win32)
整天,这些PHP网站罢工。我没有时间去服务器今晚寻找方法,但我仍然没有解决。
最后,我决定删除MySQL并重新安装它!
迅速卸载,无需重新启动计算机。
因此,继续安装。
第一步:
打开此MySQL -Essential-5.0.22-Win32.exe文件;
步骤2:查看窗口弹出,然后单击下一步
输入下一步;
步骤3:选择自定义项目,然后单击
接下来进入下一步;
步骤4:在此步骤中,请注意,请单击
更改...选择MySQL目录的原始安装;选择后,继续单击下一步输入下一步;
步骤5:单击安装
安装 ...
安装到下一步之前,您将提示您注册,选择最后一个,然后跳过注册,
输入下一步以正式完成安装。
安装完成后,继续弹出窗口以提示您立即配置它,
选择下一步
选择标准配置。
接下来进入下一步
在此步骤中,上述行被删除,仅包括
....路径线勾,继续单击下一步输入下一步
在此步骤中,单击中间的“ Ex ****”,
然后配置完成!
通过MySQL中间件解决。
一般例程是在表的中部配置的,通常是尺寸和平板电脑的数量。
这样,在要更改程序的地方,您只需要将数据库连接地址修改为中间件地址即可。剩余的逻辑可以由中间软件完成。
这种方法非常懒惰,但可以解放RD的压力。
由于建立连接的成本非常高,因此每次我们访问数据库时,它都非常消耗。
当我们启动程序时,我们可以首先创建一些连接,将其放入集合中,在访问数据库时从集合中获取它,然后将其放回集合中。
这只是在程序启动时消耗性能以创建连接。每次访问数据库时,都可以从内存中获得连接,从而可以大大提高效率。
防范措施:
因为池中的添加和删除非常频繁,所以LinkedList的使用很高
集合中的所有连接都在被占用时创建它们,但是您需要注意连接总数
使用组合模式/动态代理来处理释放连接的释放。运行关闭方法时,将连接放回池
关于数据库连接池:
数据库连接是一种关键且有限的昂贵资源,在多用户Web应用程序中尤其突出。数据库连接的管理可以显着影响整个应用程序的望远镜和鲁棒性,并影响程序的性能指标。数据库连接池为此问题提出了提出。
数据库连接池负责分配,管理和发布数据库连接。它允许应用程序重复使用现有数据库连接的使用,并且不再重新建立一个;由遗漏引起的数据库。这项技术可以显着提高数据库操作的性能。
当数据库连接池初始化时,数据库连接池是连接到连接池的,并且这些数据库连接的数量由最小数据库连接编号设置。无需履行这些数据库连接,连接池始终保证至少保证连接数。连接池的最大数据库连接限制了连接池可以拥有的最大连接数。当应用程序到连接池要求的连接数超过最大连接数时,这些请求将添加到等待队列。
最小连接数和数据库连接池的最大连接数应考虑以下因素:
1)最小连接数是维护连接池的数据库连接,因此,如果数据库连接的应用不大,则会浪费大量数据库连接资源;
2)最大连接数是连接池可以应用的最大连接数。如果数据库连接请求超过此数字,则将添加后续数据库连接请求,将影响等待队列,这将影响后续数据库操作。
3)如果最小连接数与最大连接数量太大,则第一个连接请求将获利,然后超过最小连接数量的连接请求等于建立新的数据库连接。这些数据库大于最低连接将不会在使用后立即发布。它将被放置在连接池中等待重复使用或在闲暇后释放。
当J2EE服务器启动时,将建立一定数量的池连接,并且维护少于该数字的池连接已被维护。
呼叫:当需要连接客户端程序时,池驱动程序将返回未使用的池连接并将其记录为忙碌。如果目前没有空闲连接,则池驱动程序将创建一定数量的新连接,并且新连接的数量由配置参数确定。
发布:使用池连接的使用完成后,池驱动程序记录此连接表作为空闲,其他调用可用于使用此连接
结论:以上是首席CTO注释为所有人编辑Django的全部内容。感谢您阅读本网站的内容。我希望它对您有所帮助。