protected final boolean needReload(String shop, int id, int data) {
		if (cacheTimeout > 0 && data >= 0) {
			if (id <= 0) {
				id = data = 0;
			}
			if (shop == null) {
				if (id == 0) {
					// full db
					return System.currentTimeMillis() - lastReload > cacheTimeout;
				} else {
					// global shop
					shop = GLOBAL_IDENTIFIER;
				}
			} else {
				shop = safeShopName(shop);
			}
			if (!lastRead.containsKey(shop)) {
				if (!prices.containsKey(shop)) {
					// no such shop
					return false;
				} else {
					lastRead.put(shop, new HashMap<Integer, Long>());
				}
			} else {
				Long last = lastRead.get(shop).get((id << DATA_BYTE_LEN) + data);
				if (last != null && lastReload > last) {
					return System.currentTimeMillis() - last > cacheTimeout;
				}
			}
			return System.currentTimeMillis() - lastReload > cacheTimeout;
		}
		return false;
	}