Can we use locks in Scrapy? Are they ever required as Scrapy is single threaded?
You don't need a lock since there only one thread writing to the database. However, I recommend you to have progress constantly being saved in case of random failures.
For the persistence part, you want to use a buffer to save the documents in batches to minimize database workload and total round-trip-time.
In my Item Pipeline to add data in database, during processing an item, connection to server can drop randomly and I need to re-establish connection. 
Now in the open_connection function, do I need to make sure that only one thread will create a new connection and all the concurrent request wont start creating a new connection ?
As scrapy is single threaded, I guess I would not need any locks in this scenario as one thread would re-establish connection and all the next incoming callback to process_item function would have an established connection.
If this is wrong, can I use all usual Python locks with scrapy?