|
douglas savitsky
dsavitsk at gmail.com
Thu Jun 29 18:09:36 EDT 2006
I have an application that runs on mod_python/apache using the publisher
handler. It uses an Access db as the backend (yes, I know, but the
amount of data is small so it should be fine) and connects via ADO.
In a
test environment on XP it runs fine, but when on a win2k3 server it will
load one page, but all subsequent page loads throw a
pythoncom.CoInitialize error until I restart the apache.
The structure is that the python script imports a module that contains
the ADO code.
Presumably, this is a threading issue, but I am not sure what the best
approach to fixing it is. I tried putting
pythoncom.CoInitialize/pythoncom.CoUninitialize calls in the __init__
and __del__ methods of the modules, but this did not work. Is this
something that needs to be done at a lower level? Should I wrap every
COM call or can I turn off threading somewhere?
This is mod_python 3.2, Python 2.3.5, apache2.0.*, win2k3, ado 2.8, and the
server has 2 processors in case that matters.
The error I get is:
Mod_python error: "PythonHandler mod_python.publisher"
Traceback (most recent call last):
File "C:\Python23\Lib\site-packages\mod_python\apache.py", line 299, in
HandlerDispatch
result = object(req)
File "C:\Python23\Lib\site-packages\mod_python\publisher.py", line 213, in
handler
published = publish_object(req, object)
File "C:\Python23\Lib\site-packages\mod_python\publisher.py", line 410, in
publish_object
return publish_object(req,util.apply_fs_data(object, req.form, req=req))
File "C:\Python23\Lib\site-packages\mod_python\util.py", line 439, in
apply_fs_data
return object(**args)
File "E:\http_server\timeslips\index.py", line 84, in index
rtn.append(ts_widget.make_employee_picker())
File "C:\Python23\lib\site-packages\ecptimeslips\ts_widget.py", line 128,
in make_employee_picker
rs = win32com.client.Dispatch("ADODB.Recordset")
File "C:\Python23\Lib\site-packages\win32com\client\__init__.py", line 95,
in Dispatch
dispatch, userName =
dynamic._GetGoodDispatchAndUserName(dispatch,userName,clsctx)
File "C:\Python23\Lib\site-packages\win32com\client\dynamic.py", line 91,
in _GetGoodDispatchAndUserName
return (_GetGoodDispatch(IDispatch, clsctx), userName)
File "C:\Python23\Lib\site-packages\win32com\client\dynamic.py", line 79,
in _GetGoodDispatch
IDispatch = pythoncom.CoCreateInstance(IDispatch, None, clsctx,
pythoncom.IID_IDispatch)
com_error: (-2147221008, 'CoInitialize has not been called.', None, None)
Even more strangely, with IE it will work for a bit and then die (but
only for one user), with Firefox it never works, and with Mozilla it
is in the middle -- maybe one page and then an error.
?
Thanks,
-d
|