OCCI访问数据库的问题

xdh0817 2013-11-29 11:47:43
class user
{
user{ db = new oracle();}//构造函数
...
int getconfig();
int updata_table();
...
private: oracle *db;//数据库对象
}

其中oracle用于完成数据库的连接和关闭,statement的连接关闭,回滚、、提交、日期转换等。其构造函数获取数据库描述符(用户名、密码、数据库名等内容);
user类用于提供给用户的接口。
用法比如:
int main()
{
user user_lili;

user_lili.getconfig();
user_lili.updata_table();
}

我的问题是:当user_lili.getconfig()内部出现异常的时候,需要修复user_lili,有两种办法,
第一种办法是在getconfig内部重新new一个oracle对象;
第二种办法是重新连接数据库,而不需重新new一个oracle对象。
我想请问:1、new一个这样的oracle对象消耗资源大吗?
2、不重新new,只使用原来的oracle对象重新createconnect,与先new,然后createconnect相比,性能等方面差多少?
3、一般oracle对象不会出现异常,也就是说不须重新new对象,多数情况仅仅需要重新createconnect就行了吧?





...全文
130 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
worldy 2013-11-29
  • 打赏
  • 举报
回复
已经不需要的对象,并且没有删除(局部变量函数退出或者new后没有delete)并且可用,则尽可能重复使用,不断的new,性能是一个问题,重要的会产生很多内存脆片
xdh0817 2013-11-29
  • 打赏
  • 举报
回复
引用 7 楼 maoshuoqiong 的回复:
[quote=引用 5 楼 xdh0817 的回复:] [quote=引用 4 楼 maoshuoqiong 的回复:] Occi创建一个连接大概1到2两秒。 其实你可以在oracle里面创建一个连接池 ConnectionPool *connPool=env->createConnectionPool( pooluserName, poolpassword, connectString, minConn, maxConn, incrConn); 这样可以避免连接失效还得delete和new那个什么Oracle对象
你误会了我的意思。oracle对象是user对象的一个私有数据成员,user的构造函数里new一个oracle。 例如,user.getgonfig()内部发现数据库异常时,只需要调用oracle.createconnection(),而不需要 再次new一个新的oracle。你理解了吗? [/quote] 1、在user的构造函数里头获取new的异常,如果new失败,将oracle对象设置为NULL(最好不要在oracle的构造函数里头进行数据库连接)。 2、user.getconfig()函数里头判断一下oralce对象是否为空,为空就new一个。 其它基本没有需要new的情况了[/quote] 恩,目前基本就是这样做的: 1、oracle的构造函数里头只是读取xml配置文件,获取数据库name,passwd,ip,创建Environment等信息。 2、定义了两个标识,分别标识new是否成功、连接是否建立。user.getconfig()函数里头判断一下这俩标识,如果发现new那个有问题就重新new,要是连接不可用,我就不重新new,而只是重新连接。
纯洁的老黄瓜 2013-11-29
  • 打赏
  • 举报
回复
引用 5 楼 xdh0817 的回复:
[quote=引用 4 楼 maoshuoqiong 的回复:] Occi创建一个连接大概1到2两秒。 其实你可以在oracle里面创建一个连接池 ConnectionPool *connPool=env->createConnectionPool( pooluserName, poolpassword, connectString, minConn, maxConn, incrConn); 这样可以避免连接失效还得delete和new那个什么Oracle对象
你误会了我的意思。oracle对象是user对象的一个私有数据成员,user的构造函数里new一个oracle。 例如,user.getgonfig()内部发现数据库异常时,只需要调用oracle.createconnection(),而不需要 再次new一个新的oracle。你理解了吗? [/quote] 1、在user的构造函数里头获取new的异常,如果new失败,将oracle对象设置为NULL(最好不要在oracle的构造函数里头进行数据库连接)。 2、user.getconfig()函数里头判断一下oralce对象是否为空,为空就new一个。 其它基本没有需要new的情况了
xdh0817 2013-11-29
  • 打赏
  • 举报
回复
引用 3 楼 worldy 的回复:
就是这个意思,既然对象可用,干嘛要重新创建,初始化也是开销
我现在考虑的是有没有需要重新new一个oracle对象的情况。比如我在main函数里定义user对象,他的构造函数里不是有个new嘛,如果这个new失败了,那么后续肯定无法建立连接。然后我在调用user.getconfig()的时候,肯定要在getconfig()函数内部重新new一个oracle对象,对吧。 那么除了这种情况(也就是构造函数没能成功创建oracle对象,而是在调用接口函数时重新创建oracle对象),还有其他情况需要我重新new吗?
xdh0817 2013-11-29
  • 打赏
  • 举报
回复
引用 4 楼 maoshuoqiong 的回复:
Occi创建一个连接大概1到2两秒。 其实你可以在oracle里面创建一个连接池 ConnectionPool *connPool=env->createConnectionPool( pooluserName, poolpassword, connectString, minConn, maxConn, incrConn); 这样可以避免连接失效还得delete和new那个什么Oracle对象
你误会了我的意思。oracle对象是user对象的一个私有数据成员,user的构造函数里new一个oracle。 例如,user.getgonfig()内部发现数据库异常时,只需要调用oracle.createconnection(),而不需要 再次new一个新的oracle。你理解了吗?
纯洁的老黄瓜 2013-11-29
  • 打赏
  • 举报
回复
Occi创建一个连接大概1到2两秒。 其实你可以在oracle里面创建一个连接池 ConnectionPool *connPool=env->createConnectionPool( pooluserName, poolpassword, connectString, minConn, maxConn, incrConn); 这样可以避免连接失效还得delete和new那个什么Oracle对象
worldy 2013-11-29
  • 打赏
  • 举报
回复
就是这个意思,既然对象可用,干嘛要重新创建,初始化也是开销
xdh0817 2013-11-29
  • 打赏
  • 举报
回复
引用 1 楼 worldy 的回复:
已经不需要的对象,并且没有删除(局部变量函数退出或者new后没有delete)并且可用,则尽可能重复使用,不断的new,性能是一个问题,重要的会产生很多内存脆片
恩。user的构造函数里new一个oracle对象,而oracle的构造函数会获取数据库描述符,包括密码、数据库用户名、ip地址等内容,连接的关闭开启,回滚、、提交、日期转换等。而数据库的操作接口则在user里实现。 你的意思是,在数据库异常的时候,尽可能的不要在user的成员函数里重新new oracle对象,要尽量使用user构造函数里已经new的oracle对象,重新createconnect即可。是吗?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧