最近在做一个网络数据交换平台的项目,第一次用到了ORACLE,我在程序里是用PROC写的。 
连接ORACLE的问题。先说下我的情况,我是接收到一条数据解析后进行存库,由于单线的效率实在是低,我只好改为多线程并发连接ORACLE。首先接收到数据后,主线进行处理,处理好后,存入缓存区,然后建立一个线程,进行存储。我连接数据库的代码是放到子线程中,大概调用流程为 1:ConnDB(); 2:SaveMsg(); 3: DisConn();问题出在连接与存储方面。我第一次用的代码是:EXEC SQL CONNECT :username IDENTIFIED BY assword USING :dbname;用这样的方式可以正常连接,但其实这样连接后我的并发存储就不起作用了,一次只能连接一个,存储一条数据,而且当我数据积累过多的时候还会造成数据丢失。第二次我改为:EXEC SQL CONNECT :username IDENTIFED BY assword AT : system1 USING :dbname;其中system1是我定义的一个字符数组:char system[10][10]并给其赋值。(因为我想定义10个连接并且能够自动赋值。)但此时的问题却又变成:并发连接数据库虽然成功了,可是数据却一条也存不到库里。
我存储代码为之前所说的SAVEMSG();其中的SQL执行语句里我也加了AT :SYSTEM2,这里的SYSTEM2是我用参数传递过来的,其实就是SYSTEM1,总之是对应的,其次我的子线程代码里也加入了互斥锁确保共享变量的安全。  由于我是第一次使用ORACLE,有很多不足的地方,以上的问题,还请大家指教。谢谢

解决方案 »

  1.   

    顺便问下,这个AT :SYSTEM1中的SYSTEM1是不是要在ORACLE中指定才行还是光在程序里指定就可?
    如果需要在ORACLE中指定,该如何指定??
      

  2.   

    没有用这种方法保存过数据,也不太清楚可不可以在一个线程中保存另一个线程的数据。
    我有一个想法,你可不可以在一个程序线程中处理这个三个步骤,接到下一个数据时,在程序中新建一个线程,同样执行这三个步骤,直到线程数上限为止。这样线程是由程序控制的,对于数据库来讲,是在同一个connection中处理和保存数据。与你目前做的模式基本相同,修改量不会太大。disconnect前别忘了commit,玩笑....