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 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.

Reply via email to