- 浏览: 2654989 次
- 来自: 杭州
文章分类
- 全部博客 (1188)
- webwork (4)
- 网摘 (18)
- java (103)
- hibernate (1)
- Linux (85)
- 职业发展 (1)
- activeMQ (2)
- netty (14)
- svn (1)
- webx3 (12)
- mysql (81)
- css (1)
- HTML (6)
- apache (3)
- 测试 (2)
- javascript (1)
- 储存 (1)
- jvm (5)
- code (13)
- 多线程 (12)
- Spring (18)
- webxs (2)
- python (119)
- duitang (0)
- mongo (3)
- nosql (4)
- tomcat (4)
- memcached (20)
- 算法 (28)
- django (28)
- shell (1)
- 工作总结 (5)
- solr (42)
- beansdb (6)
- nginx (3)
- 性能 (30)
- 数据推荐 (1)
- maven (8)
- tonado (1)
- uwsgi (5)
- hessian (4)
- ibatis (3)
- Security (2)
- HTPP (1)
- gevent (6)
- 读书笔记 (1)
- Maxent (2)
- mogo (0)
- thread (3)
- 架构 (5)
- NIO (5)
- 正则 (1)
- lucene (5)
- feed (4)
- redis (17)
- TCP (6)
- test (0)
- python,code (1)
- PIL (3)
- guava (2)
- jython (4)
- httpclient (2)
- cache (3)
- signal (1)
- dubbo (7)
- HTTP (4)
- json (3)
- java socket (1)
- io (2)
- socket (22)
- hash (2)
- Cassandra (1)
- 分布式文件系统 (5)
- Dynamo (2)
- gc (8)
- scp (1)
- rsync (1)
- mecached (0)
- mongoDB (29)
- Thrift (1)
- scribe (2)
- 服务化 (3)
- 问题 (83)
- mat (1)
- classloader (2)
- javaBean (1)
- 文档集合 (27)
- 消息队列 (3)
- nginx,文档集合 (1)
- dboss (12)
- libevent (1)
- 读书 (0)
- 数学 (3)
- 流程 (0)
- HBase (34)
- 自动化测试 (1)
- ubuntu (2)
- 并发 (1)
- sping (1)
- 图形 (1)
- freemarker (1)
- jdbc (3)
- dbcp (0)
- sharding (1)
- 性能测试 (1)
- 设计模式 (2)
- unicode (1)
- OceanBase (3)
- jmagick (1)
- gunicorn (1)
- url (1)
- form (1)
- 安全 (2)
- nlp (8)
- libmemcached (1)
- 规则引擎 (1)
- awk (2)
- 服务器 (1)
- snmpd (1)
- btrace (1)
- 代码 (1)
- cygwin (1)
- mahout (3)
- 电子书 (1)
- 机器学习 (5)
- 数据挖掘 (1)
- nltk (6)
- pool (1)
- log4j (2)
- 总结 (11)
- c++ (1)
- java源代码 (1)
- ocr (1)
- 基础算法 (3)
- SA (1)
- 笔记 (1)
- ml (4)
- zokeeper (0)
- jms (1)
- zookeeper (5)
- zkclient (1)
- hadoop (13)
- mq (2)
- git (9)
- 问题,io (1)
- storm (11)
- zk (1)
- 性能优化 (2)
- example (1)
- tmux (1)
- 环境 (2)
- kyro (1)
- 日志系统 (3)
- hdfs (2)
- python_socket (2)
- date (2)
- elasticsearch (1)
- jetty (1)
- 树 (1)
- 汽车 (1)
- mdrill (1)
- 车 (1)
- 日志 (1)
- web (1)
- 编译原理 (1)
- 信息检索 (1)
- 性能,linux (1)
- spam (1)
- 序列化 (1)
- fabric (2)
- guice (1)
- disruptor (1)
- executor (1)
- logback (2)
- 开源 (1)
- 设计 (1)
- 监控 (3)
- english (1)
- 问题记录 (1)
- Bitmap (1)
- 云计算 (1)
- 问题排查 (1)
- highchat (1)
- mac (3)
- docker (1)
- jdk (1)
- 表达式 (1)
- 网络 (1)
- 时间管理 (1)
- 时间序列 (1)
- OLAP (1)
- Big Table (0)
- sql (1)
- kafka (1)
- md5 (1)
- springboot (1)
- spring security (1)
- Spring Boot (3)
- mybatis (1)
- java8 (1)
- 分布式事务 (1)
- 限流 (1)
- Shadowsocks (0)
- 2018 (1)
- 服务治理 (1)
- 设计原则 (1)
- log (0)
- perftools (1)
最新评论
-
siphlina:
课程——基于Python数据分析与机器学习案例实战教程分享网盘 ...
Python机器学习库 -
san_yun:
leibnitz 写道hi,我想知道,无论在92还是94版本, ...
hbase的行锁与多版本并发控制(MVCC) -
leibnitz:
hi,我想知道,无论在92还是94版本,更新时(如Puts)都 ...
hbase的行锁与多版本并发控制(MVCC) -
107x:
不错,谢谢!
Latent Semantic Analysis(LSA/ LSI)算法简介 -
107x:
不错,谢谢!
Python机器学习库
由于需要解决django db长连接的问题,最近看了看django db backend相关实现,以及ORM。
一、django db 结构
django.db是django ORM的封装,主要由两部分构成:
- django.db.models。
- django.db.backends。
代码具体位置在在/usr/local/lib/python2.7/dist-packages/django/db。一般使用django db的方式:
from django.db import connection cursor = connection.cursor() cursor.execute('select sleep(1);');
其中
connection
定义在 django/db/__init__.py中:
connections = ConnectionHandler(settings.DATABASES) router = ConnectionRouter(settings.DATABASE_ROUTERS) connection = connections[DEFAULT_DB_ALIAS] backend = load_backend(connection.settings_dict['ENGINE'])
二、db backend结构
1.base backend
backend 属于django.db的子目录,在django.db.backends/__init__.py定义 all backend-specific,里面有一些比较重要的类:
BaseDatabaseWrapper Represents a database connection,一些比较重要的数据库连接操作,如cursor(),close()在这个类中定义。
BaseDatabaseFeatures 一些特性开关,比如是否supports_unspecified_pk
BaseDatabaseOperations
This class encapsulates all backend-specific differences
BaseDatabaseIntrospection This class encapsulates all backend-specific introspection utilities
BaseDatabaseClient This class encapsulates all backend-specific methods for opening a client
BaseDatabaseValidation 验证类,由具体的backend实现。
2.mysql backend
mysql backend只有如下6个文件,大部分类是继承于backends中定义的Base:
client.py BaseDatabaseClient
继承于
BaseDatabaseClient,实现了runshell()
compiler.py SQLCompiler
继承于django.db.models.sql.compiler.SQLCompiler
creation.py DatabaseCreation
This dictionary maps Field objects to their associated MySQL column
introspection.py DatabaseIntrospection
validation.py DatabaseValidation
There are some field length restrictions for MySQL
base.py 很重要的pakcage,定义了mysql的一些重要的类:
DatabaseWrapper mysql database connection,继承于BaseDatabaseWrapper
CursorWrapper A thin wrapper around MySQLdb's normal cursor class
DatabaseFeatures 继承于BaseDatabaseFeatures
DatabaseOperations 继承于 BaseDatabaseOperations
三、mongo db util
util.py 定义了db一些公共方法和类,被db.__init__.py调用
load_backend()
ConnectionHandler
ConnectionRouter
四、一些疑问和答案
1.Connection是如何被创建和销毁的?
答案:Connection通过BaseDatabaseWrapper 包装,每次调用_cursor()会新创建一个连接,mysql的实现如下:
def _cursor(self): if not self._valid_connection(): kwargs = { 'conv': django_conversions, 'charset': 'utf8', 'use_unicode': True, } settings_dict = self.settings_dict if settings_dict['USER']: kwargs['user'] = settings_dict['USER'] if settings_dict['NAME']: kwargs['db'] = settings_dict['NAME'] if settings_dict['PASSWORD']: kwargs['passwd'] = settings_dict['PASSWORD'] if settings_dict['HOST'].startswith('/'): kwargs['unix_socket'] = settings_dict['HOST'] elif settings_dict['HOST']: kwargs['host'] = settings_dict['HOST'] if settings_dict['PORT']: kwargs['port'] = int(settings_dict['PORT']) # We need the number of potentially affected rows after an # "UPDATE", not the number of changed rows. kwargs['client_flag'] = CLIENT.FOUND_ROWS kwargs.update(settings_dict['OPTIONS']) self.connection = Database.connect(**kwargs) self.connection.encoders[SafeUnicode] = self.connection.encoders[unicode] self.connection.encoders[SafeString] = self.connection.encoders[str] connection_created.send(sender=self.__class__, connection=self) cursor = CursorWrapper(self.connection.cursor()) return cursor
其中
self.connection = Database.connect(**kwargs)
就是在初始化Connection,然后返回一个CursorWrapper。close定义在BaseDatabaseWrapper()中,被db.__init__.py中的close()方法调用,代码如下
def close(self): if self.connection is not None: self.connection.close() self.connection = None
2.一条sql语句如何执行?
答案:通过CursorWrapper,调用其exucute()。
3.如何让django 数据库保持长连接?
答案:db.__init__.py定义了connection,在每次请求结束之后close():
# Register an event that closes the database connection # when a Django request is finished. def close_connection(**kwargs): for conn in connections.all(): conn.close() signals.request_finished.connect(close_connection)
如果不希望Django在每次请求结束以后都关闭所有的连接,可以将上述最后一行代码注释。
经过测试,这样是可以达到保持连接的要求 了。但是这种修改Django内部代码的方式过于霸道了,所以继续研究和最后一行代码相关的Signal对象,发现其中还有一个disconnect方 法,对应实现取消信号关联,所以可以采用在django项目中的settings.py文件加入如下代码来实现保持数据库长连接的非非霸道操作。
from django.core import signals from django.db import close_connection # 取消信号关联,实现数据库长连接 signals.request_finished.disconnect(close_connection)
发表评论
-
django 处理unicode编码
2013-04-28 22:18 2822django.util.encoding.py impor ... -
django lazy user实现
2013-04-26 15:48 1215代码如下: from people.service ... -
django db models探索
2013-03-24 16:04 1794一、django db models结构 django ... -
django + sqlalchemy pool 测试
2013-03-15 22:59 13801.修改gevent /duitang/dist/sys ... -
django template探索
2013-01-04 18:18 1244由于需要解决django template问题,研究了djan ... -
MySQL Connection Pooling with Django and SQLAlchemy
2012-12-28 21:54 0Here's a quick and dirty recipe ... -
Launching a High Performance Django Site
2012-12-28 21:39 1069Are the brakes on your Django a ... -
django 性能优化
2012-12-28 17:24 2119django默认的一些系统性能低下,无法支撑大流量请求,一些优 ... -
让Django支持数据库长连接
2012-12-28 17:05 1804原文:http://www.cnblogs.com ... -
django 的BaseMemcachedCache线程安全问题
2012-10-21 15:11 1120注意,django.core.cache.backends.m ... -
django request 获取请求的URL
2012-10-17 17:17 22081request.get_host() 获取请求地址 ... -
django user model
2012-09-12 22:01 937http://stackoverflow.com/questi ... -
python uwsgi
2012-07-30 17:21 0之前的文章已经提到了 django+fastcgi的运行并 ... -
在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用
2012-07-30 17:19 5原文:http://www.cnblogs.com/Alexa ... -
python web.py
2012-07-30 17:04 938使用web.py能快速启动一个web服务。 # -*- c ... -
浅析 Django runserver 的 autoreload 功能
2012-07-30 16:53 5144浅析 Django runserver 的 auto ... -
django auth_user.get_profile
2012-07-24 12:29 2620django 对 auth_user 提供了扩展get_pro ... -
django + postfix 搭建邮件服务
2012-07-23 14:48 1390email 配置: SERVER_EMAIL = &q ... -
django 中文问题
2012-07-17 16:45 1596好像每个国外的开源框架都会遇到中文问题,今天又被django ... -
django 的关联ID
2012-07-16 17:52 1027blog.album_id 是直接取外键 blog.album ...
相关推荐
快速开始使用pip安装所有引擎: $ pip install django-db-connection-pool[all] 或选择特定引擎: $ pip install django-db-connection-pool[mysql,oracle,postgresql] 配置MySQL 将django.db.backends.mysql更改为...
'ENGINE': 'django.db.backends.mysql', # 引擎,这里是MySQL 'NAME': 'test', # 数据库名 'USER': 'test', # 用户名 'PASSWORD': 'test123', # 密码 'HOST': 'localhost', # 主机,通常是本地主机 'PORT': '...
'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'db1': { # 配置第二个数据库节点名称 'ENGINE': 'django.db.backends.oracle', 'NAME': 'devdb', 'USER': '...
# 'ENGINE': 'django.db.backends.sqlite3', # 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 'ENGINE': 'django.db.backends.mysql', 'NAME': '你的数据库的名字', 'USER': '用户名', '
快速开始通过点子安装pip install django-timescaledb 在settings.py中用作数据库引擎: 标准PostgreSQL DATABASES = { 'default' : { 'ENGINE' : 'timescale.db.backends.postgresql' , ... },} 邮政地理信息系统...
'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_database_name', # 替换为你的数据库名 'USER': 'your_username', # 替换为你的数据库用户名 'PASSWORD': 'your_password', # 替换为你的数据库密码 '...
'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_database_name', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', # 或者你的数据库服务器地址 'PORT': '', # 如果不是...
一主要功能 支持访客留言功能 ...文章可按日期、分类、标签等多种形式展示 网站后台使用xadmin,弥补了原生后台难看的缺点 ... 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER':'数据库账户名',
`django.db.backends`模块则包含了不同数据库的实现,如SQLite、MySQL、PostgreSQL等。 **3. 视图(View)** 视图是Django处理HTTP请求的主要部分。在`django.views`中,有多种预定义的视图函数和类,如函数式视图...
为了解决这个问题,可以修改Django的SQLite后端代码,具体来说是`/usr/local/python3/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py`文件中的第159行及其前两行。原始代码可能如下所示: ```...
要在Django项目中使用PostgreSQL,首先需要在`settings.py`文件中的`DATABASES`配置中指定数据库引擎为`'django.db.backends.postgresql'`或`'django.db.backends.postgresql_psycopg2'`(尽管`postgresql_psycopg2`...
'ENGINE': 'django.db.backends.mysql', 'NAME': 'pricecompare', #数据库名称 'HOST':'127.0.0.1', #数据服务器IP 'PORT':3306, #端口号 ,不需要加引号 'USER':'root', #用户名 'PASSWORD':'142857' #密码 ...
'ENGINE': 'django.db.backends.postgresql', 'NAME': 'pydata', # 数据库名 'USER': 'your_username', # 数据库用户 'PASSWORD': 'your_password', # 用户密码 'HOST': 'localhost', # 数据库主机,通常为...
'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'slave': { 'ENGINE': 'django.db.backends.mysql', 'NAME': '数据库名', 'USER': '用户名', 'PASSWORD': '...
- PostgreSQL: `'django.db.backends.postgresql'` - MySQL: `'django.db.backends.mysql'` - SQLite: `'django.db.backends.sqlite3'` - Oracle: `'django.db.backends.oracle'` **知识点10:** 修改 Django ...
'ENGINE': 'django.db.backends.oracle', 'NAME': 'TEST', 'USER': 'django', 'PASSWORD': 'oracle1', 'HOST': 'localhost', 'PORT': '1521', } } ``` 而如果我们想使用SQLite3数据库,可以使用以下代码: ``...
'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_database_name', 'USER': 'your_database_user', 'PASSWORD': 'your_database_password', 'HOST': 'localhost', # 或你的数据库服务器地址 'PORT': '...
'ENGINE': 'django.db.backends.mysql', 'NAME': 'your_db_name', 'USER': 'your_username', 'PASSWORD': 'your_password', 'HOST': 'localhost', # 或者是你的数据库服务器地址 'PORT': '3306', } } ``` ...
'ENGINE': 'django.db.backends.sqlite3', 'NAME': '/home/wwwdjango/mysite/mysite.db', } } STATIC_ROOT = '/home/wwwdjango/mysite/mysite/static/' ``` 最后,我们需要修改 urls.py 文件,取消注释相关行以...
'ENGINE': 'django.db.backends.postgresql', 'NAME': 'mydatabase', 'USER': 'myuser', 'PASSWORD': 'mypassword', 'HOST': 'localhost', 'PORT': '5432', 'OPTIONS': { 'options': '-c search_path=citus'...