In 3.x, I found a JSON layer, created dynamically from data in SQL, was usable up to about 10k records, depending on the browser/machine. In the end, I created a map service sourced from SQL views using data registered to the server, pulling top 2k based on the map extent. This works pretty well for our purposes, although I'll definitely keep three js in mind when v4 is ready for us to use - I'm impressed, although, I'd be curious to know how lower-end machines, maybe with integrated cards, handle the rendering.