使用cx_Oracle会话池进行连接的django数据库后端

django-oraclepool的Python项目详细描述


ILRT Django Oracle池

Ed Crewe,2014年8月,布里斯托尔大学IT服务研发部

Taras Halturin编写的http://code.djangoproject.com/ticket/7732 rel="nofollow">http://code.djangoproject.com/ticket/7732的打包版本 Django数据库后端,使用CX_Oracle会话池进行连接

参见http://bitbucket.org/edcrewe/django-oraclepool" rel="nofollow">http://bitbucket.org/edcrewe/django-oraclepool

原始代码修改

删减了原始票据的base.py以保存池相关代码。 对其余数据库类使用标准Oracle连接, 即操作、客户和自省。

用django 1.1至1.6进行测试

额外功能

  • 将池和日志记录参数添加到设置中。
  • 连接器使用标准的python日志模型并满足日志记录 查询的完整详细信息,可以添加到文件日志或将其附加到 如果日志级别为"调试",则显示屏幕底部。
  • 添加了一个针对现有(旧)Oracle数据库运行的选项 字符字段可能没有Unicode。
  • 选项还允许对现有数据库运行测试,以便 运行测试不需要数据库创建(Oracle sys dba)权限。
  • 添加了对光标的修改,以便在不需要时不分析参数。

为什么要用它?

可能是因为我们的远程分布式Oracle网络需要很长时间 为了建立连接,使用cx_oracle的会话池 连接为请求提供了真正激进的性能提升 从3-4秒/req到0.4秒/req,快了很多倍。

对于单个Oracle直接访问,它可能仍然会提供双倍的性能。 安装并运行性能测试以查明(请参见下文)。

安装

下载鸡蛋(或者使用buildout)或者下载tarball并提取它。 然后将/path/to/django oraclepool添加到python路径。

在您的设置中指定数据库引擎='oraclepool'而不是'oracle'。

如果不想使用默认的额外数据库设置,则使用以下默认设置 使用

>>> EXTRAS = {'min':4,        # starting number of pooled connections
...           'max':8,         # maximum number of connections in the pool
...           'increment':1,   # increase by this amount when more are needed
...           'threaded':True, # server platform optimisation
...           'timeout':600,   # connection timeout, 600 = 10 mins
...           'log':0,         # extra logging functionality turned on
...           'logfile':'',    # file system path to log file
...           'existing':''    # Type modifications for existing database and flag for tests
...           'session':[]     # Add session optimisations applied to each fresh connection, eg.
...                            #   alter session set cursor_sharing = similar;
...                            #   Enables use of bind variables assuming it isnt set at a system level
...                            #   alter session set session_cached_cursors = 20;
...                            #   Allows cursor reuse between queries
...            'like':'LIKE'   # Option instead of LIKEC default which can stop indexes being used
...            }

注意,如果希望在调试模式下将sql日志记录显示在屏幕上,则添加 "oraclepool.log_sql.sql log middleware"到您的中间件类

一般性能

最初,在apache重启之后,您将看到前几个请求的时间与每个请求的时间相同 一个启动一个新的池连接。然后请求速度会随着失去Oracle而降低 连接时间。

注:请注意,如果你穿上了蟒蛇,游泳池可能会更经常地被冲水。 因此,填充请求的池通常会比较慢。

使用mod_wsgi而不是mod_python可能会增加25%,尽管这需要 生产实例的确认。

应该记住,还有很多表演工作可以 在数据库级别完成。我已经贴了一个页面,上面有一些关于 提高我博客上的数据库性能- http://edcrewe.blogspot.co.uk/p/database performance.html

汇集备选方案

Pyora池

也尝试过pyora pool请参见http://code.google.com/p/pyorapool rel="nofollow">http://code.google.com/p/pyorapool 但发现增长率只有90%左右,而且 连接控制和数据库编辑失败的问题。 这还需要一个单独的远程过程调用守护程序的整个体系结构 持有股份的连接池。在这里没有成功…虽然有用 用于跨不同应用程序或多个服务器进行池。

ORM池

通常orms有一个通用的池功能,而djangos只有一个beta版本。 在开发中,除非您插入另一个orm,例如http://www.sqlalchemy.org/" rel="nofollow">http://www.sqlalchemy.org/。 但是,这需要重新编写代码。

已经说过,一个通用的orm级池不太可能像 数据库连接器级别,其速度将低于 数据库本身(见下文)。

测试

测试通过普通的test命令运行,但是为了测试一切正常 应使用oraclepool.tests.settings中的设置文件,例如

bin/django-admin.py test oraclepool–settings=oraclepool.tests.settings

或适合添加oraclepool.tests子应用程序的应用程序。

注意:这些测试中的一些来自http://code.google.com/p/django-mssql/" rel="nofollow">http://code.google.com/p/django mssql/

它们还包括对现有数据库运行测试套件的选项 在他们的测试Oracle服务器上拥有完整的Oracle DBA权限。

关键的额外测试是通过共用oracle运行测试套件的性能计时。 连接与标准连接。希望这些计时应该表明使用oraclepool是否 在Oracle服务器网络中使用django时具有价值。

性能测试通过运行许多连接来模拟真实的环境 与生产Web服务器一样(Apache2默认为2个进程*64个线程) 而测试最多只能产生32个。 在实践中,我发现实际的绩效改进明显大于 多连接性能测试给出的速度加倍。然而,那 可能与您的生产Oracle和Web服务器环境无关。

南部

如果使用South,则需要添加以下内容-请参见oraclepool.tests.settings:

south_database_adapters={'默认值':"south.db.oracle"}

待办事项

  • oracle 11g具有内部会话池drcp和cx_oracle可以将其用于 性能更好,所以需要添加适当的修改来测试 数据库11g或更高版本,并使用此功能代替cx_Oracle端池。 注意:需要CX_Oracle 5,请参见http://www.oracle.com/technology/pub/articles/tuininga-cx_oracle.html" rel="nofollow">http://www.oracle.com/technology/pub/articles/tuininga-cx_oracle.html

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java访问私有字段而不使用getter方法?   使用PowerMockito在JavaEWSAPI中模拟测试拉订阅   启动活动时未保存java首选项并清除变量   java如何在servlet中检索子域?斯普林有帮手吗   java使用Docker从命令行构建Android项目   java Android,ActionBar后退按钮(setDisplayHomeAsUpEnabled(true))重新创建父活动   java在重用FileOutputStream时应该关闭流吗?   java使用RESTAPI将文件上载到s3 bucket   Java SOAP Web服务应用程序中的mysql用户登录方法不工作   java使用多个数字计算百分比并转换为长   java Android SQLiteDatabase查询忽略空格   java如何在Javafx中比较两个字段文本   java错误:未设置java_HOME,在Eclipse安装后找不到   java在安卓中保存对象   java如何使用jaxws从返回List<Object>的服务中检索值   java Google OAuth2 JWT令牌验证异常   SpringMVC中的JavaUTF8编码问题,当从JSP表单发送POST请求中的越南语信件时   java从webview重定向到安卓应用程序   JUnit 5中多个扩展的java顺序