Java servlet上下文和单例对象
我看到了一个Singleton类对象的示例,其中它有一个包含从数据库检索到的用户id和密码的映射。这将有助于避免在用户登录期间每次点击DB 现在我在想,这不能通过ServletContext属性来完成吗 基本上,在这两种情况下,我们将有应用程序范围的对象Java servlet上下文和单例对象,java,servlets,singleton,Java,Servlets,Singleton,我看到了一个Singleton类对象的示例,其中它有一个包含从数据库检索到的用户id和密码的映射。这将有助于避免在用户登录期间每次点击DB 现在我在想,这不能通过ServletContext属性来完成吗 基本上,在这两种情况下,我们将有应用程序范围的对象 因此,在这种情况下,我们可以使用ServletContext属性。如果您需要从应用程序中的任何位置访问映射,那么是的,它实际上是放置它的最佳位置 您可以在contextInitialized上注册一个和,您可以获得一个单例并将其存储为Servl
因此,在这种情况下,我们可以使用ServletContext属性。如果您需要从应用程序中的任何位置访问
映射,那么是的,它实际上是放置它的最佳位置
您可以在contextInitialized
上注册一个和,您可以获得一个单例并将其存储为ServletContext
然后使用web应用程序中的任意位置,通过获取相应的属性来访问它
getServletContext().getAttribute(“UsersMap”)
如果您需要从应用程序中的任何位置访问地图
,那么是的,它实际上是放置地图的最佳位置
您可以在contextInitialized
上注册一个和,您可以获得一个单例并将其存储为ServletContext
然后使用web应用程序中的任意位置,通过获取相应的属性来访问它
getServletContext().getAttribute(“UsersMap”)代码>如果数据库中的数据基本上是静态的,那么可以这样做。如果数据库中的数据是动态的,则不建议这样做。否则,您需要编写相当多的代码来保持DB和servletcontext变量的同步。当新用户在webapp上注册时,您当然希望该用户能够登录
不管怎样,如果数据库中有100万用户怎么办?您真的要将这些内容复制到服务器的内存中吗?为了什么目的?这完全违背了DB的目的。是否要验证登录?我真的无法想象为什么验证登录会如此昂贵,以至于需要在服务器内存中保存整个数据库的副本。这是一个有点像样的DB可以在不到一毫秒的时间内完成的工作。问题的根源一定要在别处解决
也许您不必要地将整个数据库复制到Java内存中,并以每行为单位完全使用Java进行验证,而不是使用SQLWHERE
子句?像这样的
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进行验证,而不是使用SQLWHERE
子句?像这样的
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是这样,为什么它们会存在