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

时间:2015-01-09 15:18:25

标签: java design-patterns singleton

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

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

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

问题

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

1 个答案:

答案 0 :(得分:3)

每个ClassLoader创建一个Singleton实例。如果您的应用程序使用单个ClassLoader,则您的单例可以通过JVM的所有实时可用。


您的问题非常广泛(6个问题合二为一),并且已通过此网站和博客条目在几个帖子中介绍过。不过,这里有一个关于这个主题的简短解释:

  

让我们假设我的应用程序中的db连接对象是单例

这是一定不能。您的数据库连接绝不能(是的,用粗体和大写字母来确保您和每个读者都不会犯这个错误)单个对象。您的Connection con 不得成为单身人士的一部分,以使其始终保持开放状态。相反,请使用适当的数据库连接池,该池将负责打开必要的物理数据库连接,并通过应用程序的实时使它们保持活动状态。

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

  
      
  1. 现在服务器中是否存在连接(单例)。由于发行版中存在所有.class文件。
  2.   

当ClassLoader初始化它时它将存在。这意味着,对象将在任何代码片段第一次调用您的单例引用时初始化。如果在部署应用程序期间没有执行任何代码行调用您的单例引用,那么它(尚未)就不会创建。

  
      
  1. 用户输入主页url(主页不需要连接对象,只是在html页面中有内容),页面已加载。现在服务器中是否存在连接(单例)。
  2.   

这在1中有解释。

  
      
  1. 用户现在尝试登录,这需要连接异议。这第一个请求是否会创建单个对象。
  2.   

答案可以从1中推断出来。

  
      
  1. 假设已创建连接对象,此对象是否适用于全球所有用户
  2.   

  
      
  1. 此连接对象的时长
  2.   

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

  
      
  1. 下一版本部署是否会清除单件对象
  2.   

从5开始:

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