我现在有些数据需要实现缓存。事件如下描述:
1、有A系统(别人的系统)和B系统(我的系统),A系统向B系统发送员工信息(工号、姓名、上报时间等)数据其中是每5秒发送一条(UDP通讯方式)。B系统实时监听A系统是否向自己发送数据,若发送则判断此员工是否在B系统的数据库中如果不在那么插入此信息,如果在那么更新员工信息。
2、由于频繁对数据库操作,数据库出现异常:连接数过多(Caused by: java.sql.SQLException: Data source rejected establishment of connection,  message from server: "Too many connections")。
3、此时我想到了对数据先进行缓存,可以缓存到一个List中,但较难实现,想请高手们指点指点。

解决方案 »

  1.   

    每5秒发送一条(UDP通讯方式)?5秒访问一下数据库会产生问题?是否没有使用db pool?在这个系统中,使用缓存是不正确的,如果确实数据库有问题!!!你应该使用消息机制或队列机制,请参考java.util Queue。
      

  2.   

    为什么会出现Too many connections?
    B系统中,没必要每次insert和update都去open connection,保持住一个或几个连接。不就好了?
      

  3.   

    已经用了db pool了,但是数据库操作很频繁的。用消息机制或队列?
      

  4.   

    你这样直接缓存到内存是不行的,试想,如果不是来一条插一条,那么你保存了个队列,对吧,当队列没有满足你的插入/修改数(或时间间隔,whatever),那么数据都在内存,如果此时当机,那么这些数据杂拌?丢咯。所以,你应该保证你处理别人的系统过来的每5秒的那个连接池是独立的,是与自己的系统的连接池分开的,这样不会导致因为自己的系统繁忙,别的系统too many connections,也不会因为别的系统繁忙导致自己的系统too many connections。如果实在是因为B系统或A系统数据量太大,则加大各自Pool的Connection数,同时调整数据库各项参数。
      

  5.   

       10楼 crazylaa说得很到位,“当队列没有满足你的插入/修改数(或时间间隔,whatever),那么数据都在内存”。但我不会去考虑关机等情况,我现在唯一的问题是如何去实时取出队列中的数据进行数据库操作。我之前考虑过用监听器来做,后来我觉得没必要,所以我现是这样搞的。当队列中的数据量达到一定数量时我就进行数据库操作,并清楚此队列数据。前继续存放以后传送过来的数据。
      我不太明白10楼所说的“所以,你应该保证你处理别人的系统过来的每5秒的那个连接池是独立的,是与自己的系统的连接池分开的,这样不会导致因为自己的系统繁忙,别的系统too many connections,也不会因为别的系统繁忙导致自己的系统too many connections。如果实在是因为B系统或A系统数据量太大,则加大各自Pool的Connection数,同时调整数据库各项参数。”。
      我说明一下,A系统是一个硬盘设备,它只负责向B系统发送数据而已,我们不能人为去控件它发送数据时间间隔等。
      

  6.   

    我曾经做过一个类似聊天那种东西 客户端将信息发送给服务端 服务端将所有的信息保存到一个LIST中 然后客户端会定时刷新获得服务端的最新数据 你这里是不是也是这个意思捏?
      

  7.   

    呵呵,我觉得首先楼主可以检查一下代码有没有关闭连接~
    然后可以试一下使用数据库的存储过程,把判断更新插入操作做到一起。
    最后还不行,分采集,待处理数据队列,存储(ConcurrentLinkedQueue)。
      

  8.   

    嘿嘿,我记得IBM的MQ就比较NB,遇到这种情况,在重新启动的时候数据能够还原,当然了,这个东西是给钱的么。
    于是想到这里的时候,我就想到了一个比较笨的办法,不知道楼主能不能考虑下
    把东西全部写到文件里,然后监听文件大小
    当文件大于某个临界值以后,就使用SQLLOADer之类的办法load到数据库去。
    不知道这样的办法是否可行。