早上好,我目前正在开发一个公开Web服务接口的Java Web应用程序。为了将全局对象保留在内存中,我将以下类用作Singleton:
public class SingletonMap {
private static final SingletonMap instance = new SingletonMap();
private static HashMap couponMap = null;
private static long creationTime;
private SingletonMap() {
creationTime = System.currentTimeMillis();
couponMap = new HashMap();
}
public static synchronized SingletonMap getInstance() {
return instance;
}
public static long getCreationTime() {
return creationTime;
}
}
我使用上面的类是为了使Web服务的所有线程都具有相同的HashMap实例。维护SingletonMap对象的Web服务类如下:
@WebService()
public class ETL_WS {
private String TOMCAT_TEMP_DIR;
private final int BUFFER_SIZE = 10000000;
private static SingletonMap couponMap;
private static SingletonProductMap productCategoryMap;
private String dbTable = "user_preferences";
public ETL_WS() {
Context context = null;
try {
context = (Context) new InitialContext().lookup("java:comp/env");
this.TOMCAT_TEMP_DIR = (String) context.lookup("FILE_UPLOAD_TEMP_DIR");
}catch(NamingException e) {
System.err.println(e.getMessage());
}
public long getCouponMapCreationTime() {
return couponMap.getCreationTime();
}
}
我拥有方法getCouponMapCreationTime()的原因是要检查Web服务的所有线程是否正在访问同一对象。以上方法正确吗?性能开销如何?您是否认为我需要Singleton属性,或者是否可以对所有线程使用静态HashMap?如果我使用静态HashMap,如果没有线程处于活动状态,它将被垃圾回收吗?
感谢您的时间。
JAX-WS Web服务本身就是Singleton。这意味着将使用单个Web服务实例(如Servlet)处理所有请求。
因此,该类的任何成员将在所有请求之间“共享”。就您而言,您无需使成员(即couponMap)成为静态属性。
结论: 不用担心,您的所有线程(请求)都将访问相同的“
couponMap”。因为不再需要getCouponMapCreationTime
了,所以我认为您可以消除SingletonMap
抽象并直接在Web服务类中使用Map。
但是我要补充一些非常重要的内容。如果有多个线程(请求)将访问您的地图,则必须使其成为线程安全的!!!有很多方法可以做到这一点,但是我将给出一个想法:使用a
ConcurrentHashMap
代替a HashMap
。这将使您所有的get(), put(), remove()
操作都是线程安全的!如果需要更大的作用域,则可以使用同步块,但是请避免使用同步方法,因为瓢太大,并且始终在this
对象上进行同步。
我正在尝试将Solaris KSSL代理(http://www.c0t0d0s0.org/archives/5575-Less-known-Solaris-Features-kssl.html)设置为Jetty Web服务器的前端。 我能够使KSSL与Apache web服务器一起工作,以便KSSL将来自端口443的所有传入SSL流量重定向到侦听端口28080的Apache web服务器。 但是,
我是web服务新手,正在阅读Martin Kalin的《Java Webservices》一书。我已经了解了它最初的基本概念,有一个问题: 假设将HTTP请求(包含SOAP消息信封)发送到JavaWeb服务()。该请求是否由Servlet内部处理,Servlet提取SOAP消息并将其转换为相应Java域对象,然后调用服务实现bean? 无论Metro和Axis等现成框架如何,这个问题都是通用的。只
本文向大家介绍搭建JavaWeb服务器步骤详解,包括了搭建JavaWeb服务器步骤详解的使用技巧和注意事项,需要的朋友参考一下 1、安装jdk7 2、安装tomcat7 注:当我们尝试启动tomcat时可能会遇到启动非常慢的情况,并且在启动日志中会看到类似以下的信息 关于本问题请参考官方文章末尾有说明 官方说明 问题说明: Tomcat 7+ heavily relies on SecureRan
本文向大家介绍Javaweb 500 服务器内部错误的解决,包括了Javaweb 500 服务器内部错误的解决的使用技巧和注意事项,需要的朋友参考一下 如下所示: java jdk版本问题,假如你自己电脑运行正常,那你配置服务器环境的时候,jdk也要换成和你自己电脑一样的版本,我的是jdk8,我已经完美的解决了。 补充知识:JavaWeb:WEB服务器 WEB WEB,在英语中web即表示网页的意
我一直在尝试实现一个单例,以用作我从网络上传到iOS应用程序的照片的缓存。我在下面的代码中附加了三个变体。我试图让变体2工作,但它导致一个编译器错误,我不明白,并希望得到关于我做错了什么的帮助。变体 1 执行缓存,但我不喜欢使用全局变量。变体3不做实际的缓存,我相信这是因为我在var ic = ....的分配中得到了一个副本,这是正确的吗? 任何反馈和见解将不胜感激。 谢谢,Zvi
Navicat 提供强大的工具来管理服务器对象,例如数据库、表、视图、函数等。注意:在 Navicat 中开始使用服务器对象前,你要首先创建连接。