Java内存存储减少数据库负载安全?

Java内存存储减少数据库负载安全?,java,mysql,Java,Mysql,如果我有一个MySQL表,该表不经常更改(每月一次),其中包含web服务的活动用户帐户等信息。执行以下操作有多安全: public AccountDao { List<Account> accounts; /*fields*/ public AccountDao() { refreshAccounts(); } public void refreshAccounts() { this.accounts = /*ca

如果我有一个MySQL表,该表不经常更改(每月一次),其中包含web服务的活动用户帐户等信息。执行以下操作有多安全:

public AccountDao
{
   List<Account> accounts;
   /*fields*/
   public AccountDao()
   {
       refreshAccounts();
   }

   public void refreshAccounts()
   {
      this.accounts = /*call to database to get list of accounts*/
   }

   public boolean isActiveAccount(String accountId)
   {
       //logic involving in memory list object above
   }
}
公共帐户 { 列出账目; /*田地*/ 公共帐户() { 刷新帐户(); } 公共帐户() { this.accounts=/*调用数据库以获取帐户列表*/ } 公共布尔值isActiveAccount(字符串accountId) { //上面的内存列表对象中涉及的逻辑 } } 我之所以这样做,是因为我必须检查每个请求的用户是否有活动帐户,以允许访问web服务。这将允许我避免在每次请求时对数据库层进行一次SQL调用(目前的重点是)。我的问题是在生产中存储这样的数据有多安全


顺便说一下,每当通过API调用添加新用户帐户时,我都会刷新帐户列表。如上所述,这种情况大约每月发生一到两次。

如果您有某种触发器在相应的数据库表更改时更新内存中的对象,那么它应该是安全的

如果没有触发器,它将成为一个正确性的问题,并可能成为一个政策问题。如果基础结构的不同部分具有不同的数据库内存版本,会发生什么情况?
例如,添加或删除用户与服务反映的更改之间的可接受时间间隔是多长?

如果在相应的数据库表更改时,您有某种触发器来更新内存中的对象,那么它应该是安全的

如果没有触发器,它将成为一个正确性的问题,并可能成为一个政策问题。如果基础结构的不同部分具有不同的数据库内存版本,会发生什么情况? 添加或删除用户与服务反映的更改之间的间隔时间可以接受多久?

请查看。如果不是memcached,那么您的库可能已经支持它了。

看看。如果不是memcached,那么您的库可能已经支持它了

  • 需要以某种方式同步对DAO中的共享状态(以及可能的调用方)的访问,以实现线程安全
  • 过时的数据可能导致错误的访问决策。因为这可能与安全相关,所以您的代码需要防弹;特别是,它需要在发生故障时可靠地工作。这使得任何基于通知的方案都不稳定-如果通知丢失怎么办
  • 内存中凭据的生存期延长。机密性仍然可以通过散列凭证来实现(坦率地说,如果有人可以读取应用程序的内存,那么您还有许多其他问题)。在内存中操纵密码需要攻击者能够访问堆内存,如果他能够访问堆内存,那么您就已经丢失了,因为他可以同样轻松地更改用于读取帐户的数据库连接
  • 这就是说,对于高流量的Web服务,缓存凭据听起来是一个明智的想法,但它并不是完全微不足道的

    编辑:否,web容器不同步线程。并发请求将由并发线程提供服务,如果这些线程碰巧读写相同的数据,则可能导致数据竞争。例如,一个线程可以在使用新信息更新帐户列表时读取该列表,从而看到一个不完整的列表

  • 需要以某种方式同步对DAO中的共享状态(以及可能的调用方)的访问,以实现线程安全
  • 过时的数据可能导致错误的访问决策。因为这可能与安全相关,所以您的代码需要防弹;特别是,它需要在发生故障时可靠地工作。这使得任何基于通知的方案都不稳定-如果通知丢失怎么办
  • 内存中凭据的生存期延长。机密性仍然可以通过散列凭证来实现(坦率地说,如果有人可以读取应用程序的内存,那么您还有许多其他问题)。在内存中操纵密码需要攻击者能够访问堆内存,如果他能够访问堆内存,那么您就已经丢失了,因为他可以同样轻松地更改用于读取帐户的数据库连接
  • 这就是说,对于高流量的Web服务,缓存凭据听起来是一个明智的想法,但它并不是完全微不足道的


    编辑:否,web容器不同步线程。并发请求将由并发线程提供服务,如果这些线程碰巧读写相同的数据,则可能导致数据竞争。例如,一个线程可以在使用新信息更新帐户列表时读取该列表,从而看到一个不完整的列表

    这很难回答。这是主观的。我们在应用程序中做了很多修改,你是对的;它可以大大提高性能。但是它会咬你吗?当然你关心什么样的安全?线程安全?证书的保密性?证书的货币。。。?我担心数据被破坏。这项服务通常一次运行几个月没有问题。什么数据?账户列表?@meriton我想一切都是安全的,但也许不是..这很难回答。这是主观的。我们在应用程序中做了很多修改,你是对的;它可以大大提高性能。但是它会咬你吗?当然你关心什么样的安全?线程安全?证书的保密性?证书的货币。。。?我担心数据被破坏。这项服务通常一次运行几个月没有问题。什么数据?帐户列表?@meriton我认为一切都是安全的线程,但也许不是..我知道缓存,但我认为只处理一两个表和几列数据有点沉重。它不像内存中的对象