JDBC的mySql引擎应该解决了这个问题,并发操作有一套内置的解决过程,就是通过锁定来实现,如果正在进行写操作,则不可能进行读操作的,你放心好了。你说的情况顶多能引起长时间超时不返回结果,用户重试就行了,其实很难达到你说的那种情形:相互之间造成很大影响,因为数据操作很快的程序设计的时候,只要及时关闭就行了,用mySql的数据库也没有什么好优化设计的,又不是DB2或Oracle或SQL Server

解决方案 »

  1.   

    我有个不成熟的算法:
        你可以让你的用户不是直接写到数据库里面,而是写到一个缓冲区里面,然后等一段时间之后刷新一下缓冲区,把它存入数据库。
        读操作也是读缓冲区,每过一段时间更新一下缓冲区。
        如果你的系统不要求实时性,更新缓冲区的时间对于WEB来说微不足道。
      

  2.   

    对于服务器来说自己可以处理这些情况的,比如WEBLOGIC自己就有连接池。
      

  3.   

    to asdmonster(asd) & hymarx(偷偷给我一点爱) 
    如果服务器down掉,数据不就全丢了!?基本赞同 Anakin_Skywalker(天行者)  要依赖数据库的事务隔离级,很多数据库缺省的隔离级是read committed,简单地说就是当一个用户锁定记录准备修改后,其他用户只能read,如果其他用户也需要锁定记录准备修改就只能等待目前拥有锁的用户提交或回滚事务来释放锁。如果要在获得锁后其他人无法read就要修改隔离级,不过隔离级越高效率就越低。MySQL要支持事务,必须使用InnoDB,一个是要在配置文件中配置好innoDB,还要在create table时指定type=innoDB。(我没有找到如何修改掉variable中的table_type)至于锁的问题,是通过select ... for update得到的,这里不多说了,网上能找到很多文章的。
      

  4.   

    read committed,简单地说就是当一个用户锁定记录准备修改后,其他用户只能read。
    少说了一点,其他用户read到的数据是数据库中当前的数据,也就是上一次某个用户事务提交的数据,这就是read committed的字面含义。
      

  5.   

    to: chenyun(牛牛) 
       第一,对这种情况,同步是一定需要的,但是在记录级别加锁是什么效果,你自己可
            以试试 ,整个过程中,如果采用专用的数据库,不管你采用什么连接方式,采用什么数据
            库,它始终是比较慢的环节(当然,比网络要快),这等待加上网络延迟将让用户失去信
            心。
      其二:我的方案里面有一个缓冲的刷新,两次刷新的时间间隔最夸张也不会容许它超过1秒,如果
            这时候down机,前台拒绝服务,丢掉这一秒间隔里的数据,不是什么大的损失。
      

  6.   

    请教 asdmonster(asd) :
    一、从理论上来说并发操作应该是下面的序列吧,
    1. A read without lock, get timestamp
    2. B read without lock, get timestamp
    3. A modify in UI
    4. B modify in UI
    5. A begintrans, lock, get timestamp,find that the timestamp not changed
    6. if B begintrans, lock, have to wait
    7. A update & commit (change timestamp)
    8. B get lastest teimestamp, find the timestamp changed
    9. B rollback or update & commit(change timestamp)对于A用户,5,7操作在数据库服务器是在一个很短的时间内完成的(具体看有多少数据量),不过我确实不知道100个并发的实际情况会是什么,惭愧,没经验。(而且由于维护timestamp会增加额外的访问,这一点我也在想要如何更好地解决)二、使用缓存也要维护同步,这个方面的效率和安全如何?
      

  7.   

    请教 asdmonster(asd) :还有一些疑问:
    1. 如果真的是100个用户并发,那么connection pool size就要100吧,这是否可行?
    2. CMP Entity Bean是不是已经提供了这样的缓存机制并维护了同步呢?
      

  8.   

    对了,楼主说用jsp+servlet+javabean + mysql,用不用Connection Pool得?如果使用DriverManager来获得连接,据我所知,DriverManager是同步方法,效率会很低。
      

  9.   

    如果真的是100个用户并发,那么connection pool size就要100吧---------------------------------------------------------
    NO,连接池的用意就是要用少量的连接应付大量的访问,连接的得到和释放是在很短的时间之内完成的(就是从数据库查询数据或修改数据的那一瞬间),100个人同时操作的可能性太小了!
      

  10.   

    你所说的情况根本构不成性能问题。
    这只是小case
      

  11.   

    可以用微软的Application Center Test来作一些模拟测试,如果你没有用到ejb,这点并发连接应该不是问题。
      

  12.   

    各位注意***********************
    如果我使用xml文件性能上可以满足这个要求吗?是把xml文件放到数据库还是自己把它放到缓
    存中?*********************************
      

  13.   

    wafer_w(流浪的风) :
    连接池的用意就是要用少量的连接应付大量的访问,连接的得到和释放是在很短的时间之内完成的(就是从数据库查询数据或修改数据的那一瞬间),100个人同时操作的可能性太小了!正因为不可能真的有100个用户在同一时刻操作数据库,所以对记录加锁并不会影响效率,对吧。
    如果能用XML,我个人认为不妨考虑考虑CSV
      

  14.   

    chenyun(牛牛) :真正让人头疼的不是连接数不够,而是需要频繁的加锁和解锁,CMP本身并不提供同步,而是由数据库保证。
    可能是你没有理解我的意思,我的意思是把这个加锁解锁的过程放到内存中而不是对数据库的记录进行操作,这样需要自己手工建立实例池而不是连接池(当然在后台也是有的),个人以为事实上楼主的需求一般数据库提供的连接池已经够用(mySql我没有用过),如果真的满足不了,JAVA本身的效率肯定也满足不了,那么就别用JAVA开发了,想想用别的路子吧。
      

  15.   

    使用J2EE的缓存,RESIN效率很好
    每秒200个数据请求