Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java servlet上下文和单例对象_Java_Servlets_Singleton - Fatal编程技术网

Java servlet上下文和单例对象

Java servlet上下文和单例对象,java,servlets,singleton,Java,Servlets,Singleton,我看到了一个Singleton类对象的示例,其中它有一个包含从数据库检索到的用户id和密码的映射。这将有助于避免在用户登录期间每次点击DB 现在我在想,这不能通过ServletContext属性来完成吗 基本上,在这两种情况下,我们将有应用程序范围的对象 因此,在这种情况下,我们可以使用ServletContext属性。如果您需要从应用程序中的任何位置访问映射,那么是的,它实际上是放置它的最佳位置 您可以在contextInitialized上注册一个和,您可以获得一个单例并将其存储为Servl

我看到了一个Singleton类对象的示例,其中它有一个包含从数据库检索到的用户id和密码的映射。这将有助于避免在用户登录期间每次点击DB

现在我在想,这不能通过ServletContext属性来完成吗

基本上,在这两种情况下,我们将有应用程序范围的对象


因此,在这种情况下,我们可以使用ServletContext属性。

如果您需要从应用程序中的任何位置访问
映射,那么是的,它实际上是放置它的最佳位置

您可以在
contextInitialized
上注册一个和,您可以获得一个单例并将其存储为
ServletContext

然后使用web应用程序中的任意位置,通过获取相应的属性来访问它


getServletContext().getAttribute(“UsersMap”)

如果您需要从应用程序中的任何位置访问
地图
,那么是的,它实际上是放置地图的最佳位置

您可以在
contextInitialized
上注册一个和,您可以获得一个单例并将其存储为
ServletContext

然后使用web应用程序中的任意位置,通过获取相应的属性来访问它


getServletContext().getAttribute(“UsersMap”)

如果数据库中的数据基本上是静态的,那么可以这样做。如果数据库中的数据是动态的,则不建议这样做。否则,您需要编写相当多的代码来保持DB和servletcontext变量的同步。当新用户在webapp上注册时,您当然希望该用户能够登录

不管怎样,如果数据库中有100万用户怎么办?您真的要将这些内容复制到服务器的内存中吗?为了什么目的?这完全违背了DB的目的。是否要验证登录?我真的无法想象为什么验证登录会如此昂贵,以至于需要在服务器内存中保存整个数据库的副本。这是一个有点像样的DB可以在不到一毫秒的时间内完成的工作。问题的根源一定要在别处解决

也许您不必要地将整个数据库复制到Java内存中,并以每行为单位完全使用Java进行验证,而不是使用SQL
WHERE
子句?像这样的

resultSet = statement.executeQuery("SELECT * FROM users");

while (resultSet.next()) {
    if (username.equals(resultSet.getString("username")) && password.equals(resultSet.getString("password"))) {
        valid = true;
        break;
    }
}
对于刚接触数据库、不了解SQL功能的初学者来说,这是一个经常重复出现的思维错误。如果在username列上设置
唯一的
索引,并在password列上设置索引,则以下方法更有效:

statement = connection.prepareStatement("SELECT id FROM users WHERE username=? AND password=md5(?)");
statement.setString(1, username);
statement.setString(2, password);
resultSet = statement.executeQuery();
valid = resultSet.next();

如果数据库中的数据基本上是静态的,那么可以这样做。如果数据库中的数据是动态的,则不建议这样做。否则,您需要编写相当多的代码来保持DB和servletcontext变量的同步。当新用户在webapp上注册时,您当然希望该用户能够登录

不管怎样,如果数据库中有100万用户怎么办?您真的要将这些内容复制到服务器的内存中吗?为了什么目的?这完全违背了DB的目的。是否要验证登录?我真的无法想象为什么验证登录会如此昂贵,以至于需要在服务器内存中保存整个数据库的副本。这是一个有点像样的DB可以在不到一毫秒的时间内完成的工作。问题的根源一定要在别处解决

也许您不必要地将整个数据库复制到Java内存中,并以每行为单位完全使用Java进行验证,而不是使用SQL
WHERE
子句?像这样的

resultSet = statement.executeQuery("SELECT * FROM users");

while (resultSet.next()) {
    if (username.equals(resultSet.getString("username")) && password.equals(resultSet.getString("password"))) {
        valid = true;
        break;
    }
}
对于刚接触数据库、不了解SQL功能的初学者来说,这是一个经常重复出现的思维错误。如果在username列上设置
唯一的
索引,并在password列上设置索引,则以下方法更有效:

statement = connection.prepareStatement("SELECT id FROM users WHERE username=? AND password=md5(?)");
statement.setString(1, username);
statement.setString(2, password);
resultSet = statement.executeQuery();
valid = resultSet.next();

是的,可以使用ServletContext属性。单例被高估、误解和滥用。在您真正理解为什么需要一个之前,不要考虑它。是的,可以使用ServletContext属性。单例被高估、误解和滥用。在你真正理解你为什么需要一个之前不要去想它。我不确定我是否完全理解你的观点。我的意思是,一百万个用户名对于内存来说有那么多吗?如果你使用缓存机制会怎么样?你认为缓存是个坏主意吗?@user384706:point是,如果一个设计良好的数据库可以在一秒钟内为您选择匹配项,那么为什么内存中会有一个数据库副本?至于缓存,我会使用JPA而不是JDBC。它允许二级缓存配置。首先,你为什么要提到复制整个数据库?OP只希望缓存用户名。让我们假设数据库中确实存在1M用户。这是不是需要增加两个开销,例如在
HashMap
中?另外,整个数据库都有缓存机制;我认为Guava cache可以做到这一点,有memcached和其他库。如果db这么快,为什么它们会存在?我问这些问题的原因是,是因为你比我更有经验,而我正试图理解你的观点。我不确定我是否完全理解你的观点。我的意思是,100万个用户名是否有那么多用于存储?如果你使用缓存机制会怎么样?你认为缓存是个坏主意吗?@user384706:point是,如果一个设计良好的数据库可以在一秒钟内为您选择匹配项,那么为什么内存中会有一个数据库副本?至于缓存,我会使用JPA而不是JDBC。它允许二级缓存配置。首先,你为什么要提到复制整个数据库?OP只希望缓存用户名。让我们假设数据库中确实存在1M用户。这是不是需要增加两个开销,例如在
HashMap
中?另外,整个数据库都有缓存机制;我认为Guava cache做到了这一点,有memcached和其他库。如果db是这样,为什么它们会存在