The Instance is a very heavyweight object, so you should only use one of them. Creating an Instance involves reading the log files on the disk and replaying any outstanding operations.
Yes, you can have multiple sessions open at the same time. They are relatively cheap, so it is fine to have dozens of them (servers may have hundreds or even thousands of open sessions*.
Sessions can NOT be used on different threads. If you open a Session on a thread, you can only use it with that thread**. Doing operations on a second thread requires a second Session. Keep in mind that using multiple sessions has many advantages, it does
have a few downsides. Specifically you can't modify the same column in two different sessions. Otherwise you'll get a 'Write-Conflict' because the ESE engine won't know which one should win.***
You only need to JetAttachDatabase a database to an instance once. Every session needs to call JetOpenDatabase() in order to use it. JetOpenDatabase() returns the JET_DBID that other functions use.
Hope that helps. Any other questions?
And this post has had way too many footnotes. :)
*If you do go up to that scale you'd probably want to re-use them, but most people can safely just open and close a new Session each time).
**There is a way around it for more advanced users. JetSetSessionContext/JetResetSessionContext.
***The exception to that is escrow-update columns.