使用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