我已经在使用PHP 7.2.15-1 + ubuntu16.04.1 + deb.sury.org + 1和mysql服务器版本5.7的Ubuntu 16.04.5计算机上使用SQLalchemy在Python 2.7中编写了一个程序。 25。
该程序似乎运行完美-我能够查询,比较和存储数据库数据。而且操作很快!我很高兴,直到意识到大量的aborted_connect Aborted_clients和Aborted_connects。
与数据库的所有连接都在同一台计算机上完成。我不是从外部IP连接到数据库。
因此,怀疑我可能忘记了关闭长代码中的某些会话,因此我开始对程序进行解构和测试。当我拆下零件时,错误继续,直到达到几乎绝对的最小值。现在,这是正在运行的整个程序,并产生aborted_connects和aborted_clients。
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.pool import NullPool
from sqlalchemy import (Table, Column, Integer, String, DateTime, ForeignKey, schema, func)
from sqlalchemy.ext.declarative import declarative_base
from datetime import date, timedelta, datetime
from sqlalchemy.orm import relationship, backref
engine = create_engine('mysql+pymysql://landingpages-username:password/Database?unix_socket=/var/run/mysqld/mysqld.sock', pool_recycle=3600, echo=False)
conn = engine.connect()
Base = declarative_base()
Session = sessionmaker(bind=engine)
class LandingPagesSimplifi(Base):
__tablename__ = 'landingpages_simplifi'
id = Column(Integer, primary_key=True)
client_id = Column(Integer(), ForeignKey('landingpages_clients.id'))
client_id_simple = Column(String(128), nullable=True)
campaign_id = Column(Integer, nullable=True)
campaign_name = Column(String(256), nullable=True)
ad_id = Column(Integer, nullable=True)
ad_url = Column(String(512), nullable=True)
ad_url_utm = Column(String(512), nullable=True)
created_on = Column(DateTime(),default=datetime.now)
class LandingPagesClients(Base):
__tablename__ = 'landingpages_clients'
id = Column(Integer(), primary_key=True)
name = Column(String(256))
id_google = Column(String(14), nullable=True)
id_facebook = Column(String(64), nullable=True)
id_simplifi = Column(Integer(), nullable=True)
user = Column(Integer(), ForeignKey('landingpages_users.id'))
class LandingPagesUsers(Base):
__tablename__ = 'landingpages_users'
id = Column(Integer(), primary_key=True)
name = Column(String(128))
email = Column(String(256))
session = Session()
first_record = session.query(LandingPagesSimplifi).first()
print first_record.id;
session.close()
不足为奇,它返回“ 1”。 没有错误。
但是如果在此之后立即运行 sudo tail /var/log/mysql/error.log ,我会看到:
[注意]与db:'LandingPages'用户:'username'主机:'localhost'的连接212中止了(读取通讯包时出错)
在进入Stackoverflow之前,我会尽力解决问题,我尝试了以下方法,并且在每种情况下,运行程序后仍然会立即发生错误。
首先,我尝试从...更改引擎的主机和套接字。
engine = create_engine('mysql+pymysql://landingpages-username:password/Database?unix_socket=/var/run/mysqld/mysqld.sock', pool_recycle=3600, echo=False)
到
engine = create_engine('mysql+pymysql://localhost/landingpages-username:password/Database', pool_recycle=3600, echo=False)
它会给出答案“ 1”,但会产生相同的错误。
或
engine = create_engine('mysql+pymysql://127.0.0.1/landingpages-username:password/Database', pool_recycle=3600, echo=False)
这也会产生“ 1”,但是会产生此错误。 以下其他操作将产生“ 1”,但仍会导致此错误。
如果我删除pool_recycle位。
更改create_engine,使其连接到该服务器上的其他数据库。
使用不同的授权凭据连接到数据库。
将绑定地址更改为本机的外部IP,即127.0.0.1、0.0.0.0,并将此行完全注释掉。
似乎唯一有帮助的是,如果我将sqlalchemy.pool中的导入NullPool 到我的程序中,并将 poolclass = NullPool 添加到create_engine参数中。 但是我真的想尽可能地使用游泳池,对吧?
仍然,这可能会提供有关问题所在的线索。但是,靠我自己的研究找不到任何帮助。我一定不能问正确的问题。 有人对问题可能出在哪里有任何建议吗?
其他重要信息:同一台sql服务器托管着另外两个数据库,这些数据库可以由本机通过Laravel php Web应用程序本地访问,并且0个aborted_connect或aborted_clients来自该程序。
其他重要信息:
show global variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 28800 |
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 28800 |
+-----------------------------+----------+
13 rows in set (0.00 sec)
在此先感谢您的帮助。