executeBatch();不能保证唯一性约束,这只能在你得sql语句中保证。
这并不能防止另外的Connection和Statement对象在此期间对目的表进行操作,
在没有发现其它的同步机制的情况下,我怀疑这种错误有可能发生。这不可能
因为,它是以线程的方式,调用,在该线程完成之前,其他的线程只能等待保证m_driverAccess 只被初始化一次

解决方案 »

  1.   

    luckyfanjian(luckyfan) 在上文中提到:
    >因为,它是以线程的方式,调用,在该线程完成之前,其他的线程只能等待
    “它”是指的当前所有有效的Connection和Statement对象么?
    这是否意味着,面对并发的web请求,系统却采用串行的机制对资源进行管理,
    对此,我觉得很难想象
    又或者,数据库系统对(数据库)操作采用了串行机制?假如在当前事务得到控制权之前,另有一个并发应用对目的表进行了查询操作,
    取出表中最大的关键字+1,之后,产生插入新记录所需的SQL语句,
    而这时,当前任务得到控制权,插入了一系列记录,于是,产生违反唯一性约束错误
    这种情况可以避免么?(当然,这种情形在前一种假设中,是不可能发生的)我对线程技术不是很了解
    所以,我在上面的陈述中可能会犯下可笑的错误
    如果有,敬请指出,不胜感激
    关于第二个问题,
    static这么用,在语法上有什么依据么?
    而这又如何保证了m_driverAccess 只被初始化一次呢?
      

  2.   

    我猜想,oracle的驱动可能是使用类似JMS的机制。对于客户端没有关系,反正所有的客户请求都会被放入队列。再说,我们使用Connection的时候是用连接池之类的机制,在加上自己的处理,应该可以避免这样的问题。
    至于static就是在ClassLoader将class载入的时候,会先运行static中的代码。
      

  3.   

    哦,照楼上的解释,static并不限定区间内的代码只运行一次?关于请求队列的猜想,我支持
    至于连接池机制,只是面对并发请求动态分配连接而已
      

  4.   

    他的工作方式类似于线程,但他不是线程,也不是队列,但是实现的和队列的功能差不多!
    不会出现你所说的问题,static内的代码,在一次运行中,虽然有个实例生成,但也是保持它原来的状态
      

  5.   

    luckyfanjian(luckyfan) 在上文中提到:
    >他的工作方式类似于线程,但他不是线程,也不是队列,但是实现的和队列的功能差不多!
    "他"是指的数据库对请求消息的管理机制
    还是连接池对连接的调度机制?>static内的代码,在一次运行中,虽然有个实例生成,但也是保持它原来的状态
    就是说,static区间的操作,类似于传参给某个方法执行我想要的操作,但不改变参数本身?
    即:调用一个
    void invokedMothed(const ParmType1 parm1,const ParmType2 parm2,.....)
    ?