There are various ways to approach this. One is setting up a standard tile server for OSM tiles (see e.g. switch2osm.org) [switch2osm.org)](http://switch2osm.org) and then use a different infrastructure to render you your POIs onto transparent tiles; in the browser, display both the base tile and the overlay tile. Advantage: Overlay can be switched off; no changes required to standard rendering toolchain; any toolchain can be used for your tiles (e.g. UMN Map Server or even a commercial product).
Another approach is setting up a standard tile server and modifying its rendering style to display your POIs. That would yield only one tile with both OSM any your POI on it.
A third way is to have a database backend that only sends to the browser that portion of your 45,000 POIs that are required for the current viewport. See www.wheelmap.org for an example of such technology. Advantage: individual POIs are still present as geometries in the browser and hence clickable.
There are even more possible solutions but listing them all is not possible here.