your query takes to much time to be executed and the query goes into timeout. >From the log I see that you are running a bulk_insert, you can split it into more operations, placing a db.commit between them. Mind that in this case the bulk_insert will be executed into few transactions.
Otherwise, you can run a custom bulk_insert based on an executesql containing all the inserts. let us know more information about the query. Paolo 2015-03-15 2:01 GMT+01:00 Ian Ryder <i.ry...@appichar.com.au>: > Thanks Paolo - sadly same result :( I'm not using pyDAL, just the usual > Web2py DAL > > ################################## > ########305######## > ################################## > Traceback (most recent call last): > File "/home/ianryder/yarpr/web2py/gluon/restricted.py", line 224, in > restricted > exec ccode in environment > File "applications/yarpr/models/my_scheduler.py", line 554, in <module> > PenguinDoer(db_app) > File "applications/yarpr/models/my_scheduler.py", line 468, in __init__ > debug_log(sys._getframe().f_code.co_name, None, start=method_start, > error_details=ee, severity='Fail') > File "applications/yarpr/models/do_debugging.py", line 197, in debug_log > debug_flush() > File "applications/yarpr/models/do_debugging.py", line 201, in > debug_flush > db_usage.debug_data.bulk_insert(DebugHandler.debug_records) > File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 9425, in > bulk_insert > ret = self._db._adapter.bulk_insert(self, items) > File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1376, in > bulk_insert > return [self.insert(table, item) for item in items] > File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1361, in insert > raise e > OperationalError: (2006, 'MySQL server has gone away') > > Here's the code: > self.dbase.commit() > self.dbase._adapter.close(action=None) > try: > # now the long running task - in the test it's a sleep for 305 > seconds. > run_method( > *loads(this_task.args, object_hook=self._decode_dict), > **loads(this_task.vars, object_hook=self._decode_dict)) #, > *passed_vars) > except Exception as ee: > self.dbase._adapter.reconnect() > this_doer = change_status( > this_doer, > FAILED, > 'Failed: ' + str(ee) > ) > this_doer.update_record() > debug_log(sys._getframe().f_code.co_name, None, > start=method_start, error_details=ee, severity='Fail') > raise Exception('Failure during method execution: ' + str(ee)) > > self.dbase._adapter.reconnect() > this_doer = change_status( > this_doer, > COMPLETED, > 'Normal exit' > ) > > > > > On Sunday, March 15, 2015 at 12:04:04 AM UTC+11, Paolo Valleri wrote: >> >> Hi, >> first of all use the latest pydal, it contains a fix when trying to close >> 'broken connection'. >> Afterwards, for a proper reconnect in your application you should do: >> - db._adapter.close() >> - db._adapter.reconnect() >> >> If you are looking for an 'auto-reconnect', namely it will re-execute all >> queries in the broken transaction, I've been working on it, have a look at >> https://github.com/ilvalle/pydal/tree/auto-reconnect >> In this case it will re-execute all commands in the last transaction (but >> if you do a db.commit() before the operation, then it is fine). >> a discussion about this new feature is here: https://groups.google. >> com/d/topic/web2py-developers/e161iZZmp0Y/discussion >> Finally, I've never tried it with mysql, but it should work since >> an OperationalError is raised. >> >> Paolo >> >> On Saturday, March 14, 2015 at 5:50:49 AM UTC+1, Ian Ryder wrote: >>> >>> Sorry, formatting was all screwy on the last bit of the OP - 2 >>> processing running together, one lasting 295 seconds and saving without >>> issue, the other lasting 305 seconds and failing because the SQL server has >>> gone / isn't reconnected: >>> >>> >>> ################################## >>> ########295######### >>> ################################## >>> >>> About to save statusClean exit for doer 2928 >>> ################################## >>> ########305######## >>> ################################## >>> About to save statusClean exit for doer 2925 >>> (2013, 'Lost connection to MySQL server during query') >>> Traceback (most recent call last): >>> File "/home/ianryder/yarpr/web2py/gluon/restricted.py", line 224, in >>> restricted exec ccode in environment >>> File "applications/yarpr/models/my_scheduler.py", line 446, in <module> >>> PenguinDoer(db_app) >>> File "applications/yarpr/models/my_scheduler.py", line 382, in __init__ >>> debug_log(sys._getframe().f_code.co_name, None, start=method_start, >>> job_status=None) >>> File "applications/yarpr/models/debug_framework.py", line 196, in >>> debug_log debug_flush() >>> File "applications/yarpr/models/debug_framework.py", line 200, in >>> debug_flushdb_usage.debug_data.bulk_insert(DebugHandler.debug_records) >>> File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 9425, in >>> bulk_insert ret = self._db._adapter.bulk_insert(self, items) >>> File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1376, in >>> bulk_insert return [self.insert(table, item) for item in items] >>> File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1361, in insert >>> raise e OperationalError: (2006, 'MySQL server has gone away') >>> >>> On Saturday, March 14, 2015 at 8:30:39 AM UTC+11, Ian Ryder wrote: >>>> >>>> Hi, we are using Web2py to do some batch processing of data but from >>>> day one have had show-stopping issues with losing connection to MySQL on >>>> PythonAnywhere. >>>> >>>> We've refactored the code to be much lighter in terms of batch sizes >>>> etc which has made it much closer to perfect but we still have problems. >>>> >>>> Essentially we're going over the 300 second timeout on PA and web2py >>>> won't reconnect no matter what we try. We have: >>>> >>>> - tried pool size 10 on the connection >>>> - tried pool size 0 on the connection >>>> - db.commit before kicking off the longer process >>>> - db.close before kicking off the longer process >>>> - tried reconnecting the entire DB when it drops >>>> - tried db._adapter.reconnect() when it drops >>>> >>>> Same results every time...the basic steps are: >>>> >>>> - scheduled method called >>>> - it calls batch task which loops through happily, constantly working >>>> on the database >>>> - returns to the original method which then tried to close a status >>>> record off and that's where it bombs >>>> >>>> Here's some code: >>>> self.my_pid = this_task.last_doer_pid >>>> new_doer = { >>>> 'doer_name': self.get_doer_name(this_task.id), >>>> 'task_queue': this_task.id, >>>> 'method_name': this_task.method_name, >>>> 'pid': self.my_pid >>>> } >>>> this_doer_id = self.dbase.task_doer.insert(** >>>> self.dbase.task_doer._filter_fields(new_doer)) >>>> this_doer = self.dbase.task_doer[this_doer_id] >>>> this_task.update_record(status=RUNNING, last_doer_id= >>>> this_doer.id, doer_name=new_doer['doer_name']) >>>> self.dbase.commit() >>>> >>>> <snip socket handling> >>>> <snip method name getting> >>>> >>>> if not run_method: >>>> this_doer.update_record(status=FAILED, status_note='Method >>>> %s not implemented' % this_task.method_name) >>>> self.dbase.commit() >>>> raise Exception('Method %s not implemented' % >>>> this_task.method_name) >>>> >>>> passed_args = passed_vars = None >>>> # close off the connection so it doesn't drop out during the >>>> processing >>>> self.dbase.commit() >>>> try: >>>> run_method( >>>> *loads(this_task.args, object_hook=self._decode_dict), >>>> **loads(this_task.vars, object_hook=self._decode_dict)) >>>> #, *passed_vars) >>>> except Exception as ee: >>>> this_doer.update_record(status=FAILED, >>>> status_note='Failed: ' + str(ee)) >>>> debug_log(sys._getframe().f_code.co_name, None, >>>> start=method_start, error_details=ee, severity='Fail' ) >>>> >>>> raise Exception('Failure during method execution: ' + ee) >>>> >>>> print 'About to save status' >>>> this_doer.update_record(status=COMPLETED, status_note='Normal >>>> exit') >>>> self.dbase.commit() >>>> >>>> print 'Clean exit for doer ' + str(this_doer.pid) >>>> >>>> Just to confirm, here's a test with 2 processes, one waiting 295 >>>> seconds and closing fine, the other waiting 305 seconds and blowing up: >>>> >>>> Database drivers available: SQLite(sqlite3), MySQL(pymysql), >>>> MySQL(MySQLdb), MySQL(mysqlconnector), PostgreSQL(psycopg2), >>>> PostgreSQL(pg8000), MSSQL(pyodbc), DB2(pyodbc), Teradata(pyodbc), >>>> Ingres(pyodbc), MongoDB(pymongo), IMAP(imaplib)################# >>>> ################# >>>> ########295##########################################About >>>> to save statusClean exit for doer 2928########################## >>>> ######## ########305##########################################(2013, >>>> 'Lost connection to MySQL server during query')About to save statusClean >>>> exit for doer 2925Traceback (most recent call last): File >>>> "/home/ianryder/yarpr/web2py/gluon/restricted.py", line 224, in >>>> restricted exec ccode in environment File >>>> "applications/yarpr/models/my_scheduler.py", line 446, in <module> >>>> PenguinDoer(db_app) File "applications/yarpr/models/my_scheduler.py", >>>> line 382, in __init__ debug_log(sys._getframe().f_code.co_name, None, >>>> start=method_start, job_status=None) File >>>> "applications/yarpr/models/debug_framework.py", >>>> line 196, in debug_log debug_flush() File >>>> "applications/yarpr/models/debug_framework.py", >>>> line 200, in debug_flush db_usage.debug_data.bulk_ >>>> insert(DebugHandler.debug_records) File >>>> "/home/ianryder/yarpr/web2py/gluon/dal.py", >>>> line 9425, in bulk_insert ret = self._db._adapter.bulk_insert(self, >>>> items) File "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1376, in >>>> bulk_insert return [self.insert(table, item) for item in items] File >>>> "/home/ianryder/yarpr/web2py/gluon/dal.py", line 1361, in insert raise >>>> eOperationalError: (2006, 'MySQL server has gone away') >>>> Any help appreciated! >>>> >>>> Cheers >>>> Ian >>>> >>> -- > Resources: > - http://web2py.com > - http://web2py.com/book (Documentation) > - http://github.com/web2py/web2py (Source code) > - https://code.google.com/p/web2py/issues/list (Report Issues) > --- > You received this message because you are subscribed to a topic in the > Google Groups "web2py-users" group. > To unsubscribe from this topic, visit > https://groups.google.com/d/topic/web2py/U-hkmIc3TZM/unsubscribe. > To unsubscribe from this group and all its topics, send an email to > web2py+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- Resources: - http://web2py.com - http://web2py.com/book (Documentation) - http://github.com/web2py/web2py (Source code) - https://code.google.com/p/web2py/issues/list (Report Issues) --- You received this message because you are subscribed to the Google Groups "web2py-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to web2py+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.