As I write this it smacks of a huge advertisement for many reasons. So let's say up-front that this is a huge [AD] for products, consultation, and development services ... but it answers the questions that were asked, so ...
[AD]
@Timbered, there are a lot of terms being mixed here. I'll try to provide clarifications for mv.NET with bullet points. This should have been a blog, but here we are. Please ask about any of these points if required.
A session license is bound between a middle-tier Windows server and one MVDBMS.
When the first client connects to the middle tier, the session manager service starts a new connection to the DBMS, and routes the request all the way through.
The session does not automatically disconnect and reconnect on every request. It remains connected so that the next request moves through without the burden of a new connection.
When connected to the DBMS on a licensed DBMS port, that session license is in-use. In this respect, there is a one-to-one relationship between the session license and the DBMS license.
When another user needs a query processed, the session manager service looks for an open session.
If there is an available session, not currently in use by another user, the request is routed to that session. We see here that the DBMS license is still truly consumed by only one user at a time. It's physically impossible to multiplex two users into a DBMS connection at the exact same time.
If all active sessions are in use, whether one or more, new requests are queued for processing to the first connection that becomes available.
To recap on that...Assume you have 3 users and 2 mv.NET sessions.
User1 grabs session1 and might release it quickly. So a request from user2 will be processed on session1 immediately afterward.
Assume user2 on session1 has a longer query when user3 comes in. They will be connected to session2. ("I can help the person who is next in line!")
Now user2 releases sesssion1 and user4 comes in. They get session1 again.
The other sessions are only used as needed.
Since each session is logged into a specific account, it will only process requests on that one account.
I have a client who has 8 web portals, each of which integrates with a single D3 account. They have mv.NET session licenses dedicated to specific portals. So there are 5 licenses for one portal, 2 for another, 1 for another, etc.
Where there is only 1 license, we expect low volume, like the "10 items or less" express lane. In this case it's OK for user2 to wait behind user1 for a few milliseconds.
For greater volume we allocate more licenses (check out lanes) and spread the load.
For each of those portals we have tens to hundreds of named users, people around North America who randomly need access to their applications. They are logged-in to the application, but they are only actively using the connections when they interact with the UI.
We see here that while there is a one-to-one ratio of mv.NET sessions to DBMS licenses, this is not related to the end-user count. There is no licensing for named-users, though applications written over mv.NET can certainly employ that model.
To be clear, you only get as many mv.NET session licenses as you wish to handle expected load. There is no minimum, and the count is not bound to the server DBMS license count. In the above example, we have 29 MV licenses, 8 portals, and something like 12 mv.NET sessions to broker requests. We allocate and de-allocate those licenses as required. We can also increase and decrease the license count as required by issuing a new key, and the support fees for the licenses are pro-rated.
The session manager offers a lot of options to manage how this all works:
Sessions can be connected to MV ports when the manager is started, so there's no run-time burden to login.
Sessions can disconnect after a period of inactivity. Consider 3 sessions, session1 is always in AccountA, session2 is always in AccountB. Session3 will only connect if one of the other ports is already processing an active request and a second request comes in. It can then disconnect and connect to the other account if required.
If a connection dies, the session manager starts a new session to continue processing on another MV port.
The balance we seek is to get as few mv.NET session licenses as possible, dedicate some to the applications/accounts that we know are going to be hit a lot, and let a few others float just in case there is unexpected volume.
There are many options for timeouts, for connections that take too long, for logins that take too long, or simply to allow processes to wrapup gracefully to release resources.
The session manager service can broker connections to many MVDBMS systems for almost all MVDBMS platform types.
This is all done with a single, uniform library.
For all of those "what about..." scenarios, know that there are options available, whether in settings or with coding techniques.
Connection libraries like QMClient and UniObjects do not have their own pooling.
For those of us who support multiple MV platforms, we need different client code, or our own custom universal wrappers.
If we choose to write our own session management, we have to do all of that on our own, or we can pay the DBMS providers to use their mechanisms.
So in this respect, the mv.NET session manager is
itself a convenience product for end-users, to help them to maximize the
efficiency of their databases.
There is a developer license which includes software and support.
A single developer license can be used to create apps for any number of end-user sites, of any size. (This is how I personally use it.)
The developer license is included 2 session licenses. These allow the developer to connect to any MV platform for any purpose.
The developer can use one license himself and give one to a client.
The cost for the developer license is the same as the 2 session licenses, plus just a little bit more for developer support.
I've had people buy the developer license just for the 2 session licenses, and for the extra few bucks they have the benefit having their own developer toolkit.
The developer package provides value that earns its place as a separate product, and thus its own licensing. It includes a library that is more familiar to MV people (Core Objects) and one more familiar to RDBMS people (Adapter Objects). It includes an ORM package similar to Hibernate or CSLA, but completely integrated with MV. It also includes tools to facilitate development of REST services. There's even a little report generator built-in.
So yes, there is a cost for the developer license. This is because the sessions can be used anywhere, and for the support. But as you see this is not like some products that cost a huge amount for the developer And there is a separate huge cost for end-users.
The pricing model for mv.NET isn't rigid. There are quantity discounts both for sessions and for developer licenses. We can also offer a special pricing model for consumer applications, mobile, IoT, kiosks, and others, where mv.NET is a simple component in a larger network. This is ideal for those situations where you really have no idea how many sessions you're going to need, but you know you need a Lot of them, and you can't have the cost of connectivity inflate your consumer pricing by some multiplier.
Back on target with
ADO.NET, that is included as one of the features. However, ask yourself if you really need it. Why not read records and use conventional methods to create DataTables, etc? Your back-end interface doesn't need to be the same as the mechanisms you're using with your UI. In fact, that's a violation of separation of concerns. The data access (model) should be completely abstracted from whatever you're doing in a view or controller. If you really want to use
ADO.NET, yes, mv.NET is awesome for that and all of the above features.
If you are OK with rolling your own columns and rows, but you still want pooling, consider Linkar. It includes most functionality that we appreciate in mv.NET. It does not include features that few of us use in mv.NET. It has many other features that are not in mv.NET. The cost is much less. And it's aggressively supported.
You may also consider a hybrid option - like asking someone like me to create a wrapper for Linkar that will accept and return result sets in whatever class/format you require, while you focus on the UI in the front end, and providing data from the back end, without concern initially for how the middle-tier works. This way you get the best of all worlds with a low connectivity cost.
Please feel free to contact me about mv.NET (and that PDF), Linkar, and anything else related to databases or communications. :)
[/AD] :)
PS: Please do not assume any inaccuracy or omission is intentional or evasive. While this is already huge, I rattled it off quickly with no intention to be fully comprehensive, only to clarify existing confusion. I will be happy to correct anything that's incorrect, and provide more information as it seems reasonable, just ask. Thanks.