Questa è una domanda veramente difficile, almeno per me che è na settimana ci sbatto la testa e non riesco arisolvere nulla.

Il mio problema è il seguente: ho un webservice che, una volta ricevuta una request, per costruire la response deve interrogare uno o più server. L'applicazione funziona già perfettamente, ma per migliorare le prestazioni mi è stato chiesto di gestire le connessioni con socket in modalità keep-alive.
Se avessi interrogato sempre il solito server non sarebbe stato un problema, ma a seconda del servizio richiesto la chiamata esterna principale può variare e devo interrogare server diversi censiti su db.
Qui nasce il problema: non potendo creare una classe java per ogni server (non posso mettere mano al codice ogni volta che si vuole aggiungere un servizio), una volta creato il socket lo vado a memorizzare in una final static HashMap, ma appena lo memorizzo in una qualsivoglia struttura dati il socket mi chiude tutti gli stream (da e verso il server)

codice:
	public Socket getSocket(URL myUrl, String ServiceId, String SessId) throws IOException {
		if(SessId == null) SessId = "";
		if(ServiceId == null) ServiceId = "";
		String host = myUrl.getHost();
		int port = myUrl.getPort();
		if (port == -1)
			port = (myUrl.getProtocol().indexOf("https") >= 0) ? 443 : 80;
		con = (Socket) connections.get(ServiceId+host+port);
		log.debug("socket=" + con);
		if(con != null) log.debug("Socket "+(con.getKeepAlive() ? "Keep Alive " : "Keep Dead ")+(con.isClosed() ? "Chiuso ":"Aperto ")+(con.isOutputShutdown() ? "OS down":"OS up"));
		if(con == null || con.isOutputShutdown()|| con.isClosed()) {
			if(con != null) {
				con.close();
				log.debug("###### Ripristino connessione "+ServiceId+host+":"+port+" trovata chiusa#####");
			} else {
				log.debug("###### Creata connessione "+ServiceId+host+":"+port+" #####");
			}
			con = sFactory.createSocket();
			//connections.put(ServiceId+host+port, con);
			if (log != null)
				log.debug(ServiceId + " " + SessId + " - Connecting to socket " + host + " : " + port+(con.getKeepAlive()?" is Keep-alive" : " is not Keep-alive")+(con.isClosed()?" is Close" : " is Open"));
		} else {
			log.debug("###### Recuperata connessione "+ServiceId+host+":"+port+" #####");
		}
		if(!con.isConnected()) {
			con.connect(new InetSocketAddress(host, port), this.connect_timeout);
		}
		con.setSoTimeout(this.read_timeout*10);
		con.setKeepAlive(true);
		return con;
	}
Cerco disperatamente una soluzione al problema