[求助]Linux下使用occi连接oracle的问题

时间:2021-11-28 01:46:16
如题,最近一个项目需要在linux上开发一个B/S系统,在处理数据库访问这一块关注到了occi
但是对其中的一些地方不明白,特来求助大神。

OCCI提供了访问数据库的接口,流程相对简单
CreateEnvironment  //创建环境变量
CreateConnection   //创建连接
CreateStatement    
Statement::SetSQL()
Statement::Execute()
TerminateStatement
TerminateConnection
TerminateEnvironment

简单的流程如上,但是“考虑到大量的并发访问,OCCI提供了连接池的使用”
以上的说明是OCCI的中文文档提供的,使用连接池则流程如下
CreateEnvironment  //创建环境变量
CreateConnectionPool
CreateConnection   //创建连接
CreateStatement    
Statement::SetSQL()
Statement::Execute()
TerminateStatement
TerminateConnection
TerminateConectionPool
TerminateEnvironment

如上所示,只是在创建环境变量之后以及释放环境变量之前增加了连接池的创建和释放。

接下来就是我不明白的地方,OCCI创建连接池一样要求提供用户名,密码以及连接字符串:
//建立连接池  
ConnectionPool *connPool=env->createConnectionPool(  
  pooluserName,  
  poolpassword,  
  connectString,  
  minConn,  
  maxConn,  
  incrConn);  

虽然这里的参数提示为poolusername和poolpassword,但是我仍然无法理解。
如果我不采用连接池,那么对于多线程的访问,可以在数据库操作接口*享Environment变量,然后为每个线程创建连接并在操作完成后释放该连接,那么如果使用连接池,难道也是为每个线程创建一个连接池,然后再在各自的连接池中创建连接吗?但是如果这样的话,使用连接池似乎没有任何好处。

我知道自己的理解应该不对,但是实在不明白创建连接池时候的poolusername和poolpassword代表了什么,到底连接池是如何使用,并且起到节省开销的作用的?

希望有耐心的大神帮我解下惑!!!!感激不尽!!

14 个解决方案

#1


来个大神啊。。。。

#2


连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。

#3


如果为每个线程都开一个数据库连接的话,当数量一大效率会明显的 降低,所以我们通过创建连接池来处理这样的情况。

#4


引用 2 楼 maoshuoqiong 的回复:
连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

#5


引用 4 楼 linchang_3344 的回复:
Quote: 引用 2 楼 maoshuoqiong 的回复:

连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

是我说片面了,因为我公司用到occi的连接池,主要是用到它的多连接上面了。
连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
pConnPoll->createConnection获取已有连接,或者增加新的数据库连接。
线程池的特点是,你调用TerminateConnection时,不会把这个连接给释放掉的,
真正释放连接是在调用TerminateConnectionPool时;或者是在有空闲连接,超过maxConn时会自动释放一些连接。

连接池的出现主要是避免程序频繁开启和关闭连接所造成的资源浪费。

#6


引用 5 楼 maoshuoqiong 的回复:
Quote: 引用 4 楼 linchang_3344 的回复:

Quote: 引用 2 楼 maoshuoqiong 的回复:

连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

是我说片面了,因为我公司用到occi的连接池,主要是用到它的多连接上面了。
连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
pConnPoll->createConnection获取已有连接,或者增加新的数据库连接。
线程池的特点是,你调用TerminateConnection时,不会把这个连接给释放掉的,
真正释放连接是在调用TerminateConnectionPool时;或者是在有空闲连接,超过maxConn时会自动释放一些连接。

连接池的出现主要是避免程序频繁开启和关闭连接所造成的资源浪费。


你好!感谢你的耐心解答,我明白连接池对于节省开销方面的原理了。
我还想请教一下,按这个意思的话,其实我可以一开始只申请一个环境变量pEnv,然后用该环境变量来申明一个连接池pConnPool,之后所有的数据库连接(这里暂时不用考虑成大并发Web端请求)都从这个连接池里分配并且维护。
  那么这样的话我有一个疑问就是由pEnv创建连接池的时候createConnectionPool所要求的poolUsername和poolPasswd又是什么意思,这不是在还没有用户发起连接请求的时候就先创建好连接池吗,那么这里的连接池用户名又从何而来呢?是我自己随便扔两个字符串进去就可以吗?

  另外,再请教一下,假设我的系统上并不想在后台服务端启动时,由服务端去创建环境变量和连接池,而就是希望在任何时候的任何数据库连接请求都独自处理,那我只剩下“让每个线程自己去创建环境变量和连接(或连接池)”这么一条路了吗?因为这样的话,不就导致我会“频繁的开启和关闭连接,并且还多了创建和释放环境变量的开销了”。因为系统要求可能是服务端只关心它需要调度别的模块接口,而这些模块接口是否需要访问数据库是服务端不愿意去关心的,因此只能让这些接口自己去调用数据库接口来进行访问,但是这样的话有什么方法可以节省因为频繁创建环境变量和连接所造成的巨大开销吗?

  你的回答真的对我帮助很大,还请不吝赐教。。

#7


1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的

#8


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


你好,我明白你的意思了!
1:首先是说创建线程池的时候(createConnectionPool)输入的poolusername和poolpasswd也是建立到数据库的连接的,准确是说,这个时候创建了线程池,同时线程池中创建了minCon个poolusername连接,是这样的吗?之后的连接这样子如果再有一个连接请求是这个poolusername发起的,那么他可以直接使用现有的连接,即使是由别的user发起的,那么也只是在线程池中使用createConnection来创建并由线程池来维护,线程池是共有的,它虽然是由最早的那个poolusername创建,但是之后他对任何一个user都是平等对待的了。

2:如果要共享连接池,那么就需要我一开始创建好Env,并用第一个发起连接的user来创建好线程池,而之后所有的线程共用这个pConnectionPool变量来创建连接,以达到共享连接池的作用是吗?


至此我基本明白了整个原理,非常感谢你的耐心回答!!谢谢你!

#9


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?

#10


引用 9 楼 linchang_3344 的回复:
Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

#11


引用 10 楼 maoshuoqiong 的回复:
Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么

#12


引用 11 楼 linchang_3344 的回复:
Quote: 引用 10 楼 maoshuoqiong 的回复:

Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么


呵呵!你可以试试啊!

#13


不好意思又来麻烦你,我现在又遇到一个问题,例如网上很多的例子,写个main函数直接调用occi接口与数据库交互,编译的时候需要指定libstdc++.so.5这个标准库,我使用的也是好好的,但是后来到64位的linux下,编译就过不了了,提示could not read symbols,file in wrong format,一查,果然是因为上面那个标准库是32位的,所以指定该库的64位版本,编译可以过了,但是运行起来还只到创建环境变量就报出段错误了,这方面你能帮我下么

#14


引用 12 楼 maoshuoqiong 的回复:
Quote: 引用 11 楼 linchang_3344 的回复:

Quote: 引用 10 楼 maoshuoqiong 的回复:

Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么


呵呵!你可以试试啊!



不好意思又来麻烦你,我现在又遇到一个问题,例如网上很多的例子,写个main函数直接调用occi接口与数据库交互,编译的时候需要指定libstdc++.so.5这个标准库,我使用的也是好好的,但是后来到64位的linux下,编译就过不了了,提示could not read symbols,file in wrong format,一查,果然是因为上面那个标准库是32位的,所以指定该库的64位版本,编译可以过了,但是运行起来还只到创建环境变量就报出段错误了,这方面你能帮我下么 

#1


来个大神啊。。。。

#2


连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。

#3


如果为每个线程都开一个数据库连接的话,当数量一大效率会明显的 降低,所以我们通过创建连接池来处理这样的情况。

#4


引用 2 楼 maoshuoqiong 的回复:
连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

#5


引用 4 楼 linchang_3344 的回复:
Quote: 引用 2 楼 maoshuoqiong 的回复:

连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

是我说片面了,因为我公司用到occi的连接池,主要是用到它的多连接上面了。
连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
pConnPoll->createConnection获取已有连接,或者增加新的数据库连接。
线程池的特点是,你调用TerminateConnection时,不会把这个连接给释放掉的,
真正释放连接是在调用TerminateConnectionPool时;或者是在有空闲连接,超过maxConn时会自动释放一些连接。

连接池的出现主要是避免程序频繁开启和关闭连接所造成的资源浪费。

#6


引用 5 楼 maoshuoqiong 的回复:
Quote: 引用 4 楼 linchang_3344 的回复:

Quote: 引用 2 楼 maoshuoqiong 的回复:

连接池是为了防止你的连接失效之后,自动重连用的。
不是你说的会创建多个连接给多个实例来用。


连接池只为了自动重连吗?那为什么说它可以节省资源呢?
而且我看到是
pConnPool = pEnv->createConnectionPool(...);
pConn = pConnPoll->createConnection(...);
确实是在连接池里面创建连接的呀,而且这里也允许不同用户连接不同数据库的不是吗。。

是我说片面了,因为我公司用到occi的连接池,主要是用到它的多连接上面了。
连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
pConnPoll->createConnection获取已有连接,或者增加新的数据库连接。
线程池的特点是,你调用TerminateConnection时,不会把这个连接给释放掉的,
真正释放连接是在调用TerminateConnectionPool时;或者是在有空闲连接,超过maxConn时会自动释放一些连接。

连接池的出现主要是避免程序频繁开启和关闭连接所造成的资源浪费。


你好!感谢你的耐心解答,我明白连接池对于节省开销方面的原理了。
我还想请教一下,按这个意思的话,其实我可以一开始只申请一个环境变量pEnv,然后用该环境变量来申明一个连接池pConnPool,之后所有的数据库连接(这里暂时不用考虑成大并发Web端请求)都从这个连接池里分配并且维护。
  那么这样的话我有一个疑问就是由pEnv创建连接池的时候createConnectionPool所要求的poolUsername和poolPasswd又是什么意思,这不是在还没有用户发起连接请求的时候就先创建好连接池吗,那么这里的连接池用户名又从何而来呢?是我自己随便扔两个字符串进去就可以吗?

  另外,再请教一下,假设我的系统上并不想在后台服务端启动时,由服务端去创建环境变量和连接池,而就是希望在任何时候的任何数据库连接请求都独自处理,那我只剩下“让每个线程自己去创建环境变量和连接(或连接池)”这么一条路了吗?因为这样的话,不就导致我会“频繁的开启和关闭连接,并且还多了创建和释放环境变量的开销了”。因为系统要求可能是服务端只关心它需要调度别的模块接口,而这些模块接口是否需要访问数据库是服务端不愿意去关心的,因此只能让这些接口自己去调用数据库接口来进行访问,但是这样的话有什么方法可以节省因为频繁创建环境变量和连接所造成的巨大开销吗?

  你的回答真的对我帮助很大,还请不吝赐教。。

#7


1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的

#8


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


你好,我明白你的意思了!
1:首先是说创建线程池的时候(createConnectionPool)输入的poolusername和poolpasswd也是建立到数据库的连接的,准确是说,这个时候创建了线程池,同时线程池中创建了minCon个poolusername连接,是这样的吗?之后的连接这样子如果再有一个连接请求是这个poolusername发起的,那么他可以直接使用现有的连接,即使是由别的user发起的,那么也只是在线程池中使用createConnection来创建并由线程池来维护,线程池是共有的,它虽然是由最早的那个poolusername创建,但是之后他对任何一个user都是平等对待的了。

2:如果要共享连接池,那么就需要我一开始创建好Env,并用第一个发起连接的user来创建好线程池,而之后所有的线程共用这个pConnectionPool变量来创建连接,以达到共享连接池的作用是吗?


至此我基本明白了整个原理,非常感谢你的耐心回答!!谢谢你!

#9


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?

#10


引用 9 楼 linchang_3344 的回复:
Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

#11


引用 10 楼 maoshuoqiong 的回复:
Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么

#12


引用 11 楼 linchang_3344 的回复:
Quote: 引用 10 楼 maoshuoqiong 的回复:

Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么


呵呵!你可以试试啊!

#13


不好意思又来麻烦你,我现在又遇到一个问题,例如网上很多的例子,写个main函数直接调用occi接口与数据库交互,编译的时候需要指定libstdc++.so.5这个标准库,我使用的也是好好的,但是后来到64位的linux下,编译就过不了了,提示could not read symbols,file in wrong format,一查,果然是因为上面那个标准库是32位的,所以指定该库的64位版本,编译可以过了,但是运行起来还只到创建环境变量就报出段错误了,这方面你能帮我下么

#14


引用 12 楼 maoshuoqiong 的回复:
Quote: 引用 11 楼 linchang_3344 的回复:

Quote: 引用 10 楼 maoshuoqiong 的回复:

Quote: 引用 9 楼 linchang_3344 的回复:

Quote: 引用 7 楼 maoshuoqiong 的回复:

1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的


引用 7 楼 maoshuoqiong 的回复:
1、连接池在初始化的时候会先起几个连接,主要由createConnectionPool函数的最小连接数参数minConn决定。当发现线程池现有连接不够用的时候会增加incrConn个,最多是maxConn个。
poolUsername和poolPasswd是初始化是起连接时的用户名和密码,还有当发现线程池连接不够用的时候,自动创建连接时的用户名和密码。如果随便放几个字符,会创建失败。如果不想初始化的时候就创建连接,可以将minConn设置成0。
pConnPoll->createConnection也会让输入用户名和密码,可以看出,线程池是以用户名和密码来确定你的连接的(如果线程池发现有这个用户名和密码的空闲连接,就直接返回给你。如果没有发现,就会创建新的连接)。

2、对于多线程,你可以创建一个连接池,然后给所有线程共同使用啊!比如:
CoonPoll cp;
Thread1 t1;
Thread2 t2;
cp只要是共享的(比如是一个全局变量;或者是局部变量,线程创建时以参数形式传递给线程),t1和t2都可以使用的



by the way,可否在创建线程池的时候先不创建连接吗?因为这样的话,封装起来更方便,一开始直接创建好环境变量和线程池(尚未有连接),之后再从线程池里创建连接?


不想在创建连接池的时候创建连接,可以将createConnectionPool的minConn设置为0

那么用户名密码呢,也可以先传NULL么


呵呵!你可以试试啊!



不好意思又来麻烦你,我现在又遇到一个问题,例如网上很多的例子,写个main函数直接调用occi接口与数据库交互,编译的时候需要指定libstdc++.so.5这个标准库,我使用的也是好好的,但是后来到64位的linux下,编译就过不了了,提示could not read symbols,file in wrong format,一查,果然是因为上面那个标准库是32位的,所以指定该库的64位版本,编译可以过了,但是运行起来还只到创建环境变量就报出段错误了,这方面你能帮我下么