单例对象是在 java 中按会话还是按服务器启动创建的

Is singleton object creates per session or per server startup in java

我在互联网上没有得到任何答案,请发送答案。

单例对象是在 java 中为每个会话还是每个服务器启动创建的。

假设数据库连接对象在我的应用程序中是单例的,我在服务器中部署了我的应用程序。

问题

  1. 现在服务器中是否存在连接(单例)。由于所有 .class 文件都存在于发行版中。
  2. 用户输入了主页 url(主页不需要连接对象,只有 html 页面中有内容),页面已加载。服务器中是否存在connection(singleton)
  3. 用户尝试登录,需要连接异议。这第一个请求是否会创建单例对象。
  4. 假设创建了连接对象,这个对象是否用于全世界的所有用户
  5. 这个连接对象多长时间
  6. 下个版本部署会不会清除单例对象。

请回答。

每个 ClassLoader 创建单例实例。如果您的应用程序使用单个 ClassLoader,那么您的单例在 JVM 的整个生命周期中都是可用的。


您的问题非常广泛(6 个问题合二为一),并且已经在本网站和博客条目中的多篇文章中有所涉及。尽管如此,这里还是对该主题进行了简要说明:

Lets assume db connection object is singleton in my application

这是绝不能。您的数据库连接 绝不能 (是的,加粗并用大写字母确保您和每个 reader 永远不会犯此错误)单例对象。您的 Connection con 不能 是单例的一部分以使其始终保持打开状态。相反,使用适当的数据库连接池,它将负责打开必要的物理数据库连接,并在您的应用程序运行期间使它们保持活动状态。

现在,针对您的具体问题:

  1. Is connection(singleton) exists in the server now. Since all .class files existed in the release.

在ClassLoader初始化的时候就会存在。这意味着,该对象将在任何代码段必须调用您的单例引用时首次初始化。如果在您的应用程序部署期间执行的代码行没有调用您的单例引用,那么它还没有创建。

  1. User typed the home page url(home page doesnt need connection object, just has content in the html page), page was loaded. Is connection(singleton) exists in the server now.

这在 1.

中有解释
  1. User tried to login now, which needs connection objection. Will this first request creates singleton object.

从1可以推断出答案

  1. Lets say connection object created, is this object uses for all the users around the world

是的。

  1. How long this connection objects

它会一直存在,直到 class 从 ClassLoader 中卸载。根据发送到 JVM 的执行参数,这可能意味着 class 将永远不会被卸载,这意味着您已经产生了内存泄漏并且可能会始终打开一个连接(如果您已确保此为了重新发明轮子而不是使用数据库连接池,物理数据库连接一定不能死)。如果 ClassLoader 永远不会卸载 classes,那么当 JVM 停止时,这个单例对象将 消亡

  1. Will next version deployment clears the singleton object

来自 5:

如您所见,这是一个非常糟糕的想法在您的应用程序中创建单例的唯一想法(尽管事实是它用于数据库连接或任何您want/need) 除非你明确地知道你在做什么并且你知道要发送给 JVM 的参数。否则不做。