OCCI线程安全
线程是任务调度的基本单位,一个进程中可以有多个线程,每个线程有自己的堆栈空间,
进程中的代码段、数据段和堆栈对进程中的线程是可见的。在使用线程时通常都要考虑数据的安全访问。
常用的线程同步方法有:
- 互斥变量
- 读写锁
- 条件变量
- 屏障
- 自旋锁(用于CPU,锁住后CPU将不执行其他事情,即一直等待)
在OCCI程序中使能线程安全,则应指定THREADED_MUTEXED
选项创建运行环境
例如:
Environment *env =
Environment::createEnvironment(Environment::THREADED_MUTEXED)
注意:
- 如果应用程序是单线程,则使用默认值创建环境即可;
如果指定THREADED_MUTEXED
选项创建将会影响应用程序性能。- OCCI中的线程安全仅仅指的是
Environment
、Map
、ConnectionPool
、
StatelessConnectionPool
和Connection
对象。对于Statement
、ResultSet
、
SQLException
、Stream
等不是线程安全的,因此不应该在多个线程中共享。
以下例子创建一个只有一个连接的无状态连接池,创建两个线程去竞争从池中得到连接
当以线程安全创建环境时程序运行正常,当使用默认选项创建环境时,程序将抛出异常:
what(): ORA-03117: two-task save area overflow
#include <iostream>
#include <cstdlib>
#include <pthread.h>
#include <unistd.h>
#include <occi.h>
#define USERNAME "scott"
#define PASSWORD "scott"
#define DBNAME "//192.168.42.135:1521/orcl"
#define MAXCON 1
#define MINCON 0
#define INCCON 1
using namespace oracle::occi;
using namespace std;
void *displayAllRows(void *arg);
void *updateRow(void *arg);
int main(void)
{
Environment *env = Environment::createEnvironment(Environment::THREADED_MUTEXED);
//创建无状态连接池
StatelessConnectionPool *scp =
env->createStatelessConnectionPool(
USERNAME, PASSWORD, DBNAME, MAXCON, MINCON, INCCON,
StatelessConnectionPool::HOMOGENEOUS);
//设置池中的连接空闲超时时间,超时后OCCI会自动释放此连接,需要时在创建
scp->setTimeOut(10);
cout << "*****************Information**************************" << endl;
cout << "Open Connection : " << scp->getOpenConnections() << endl;
cout << "Busy Connection : " << scp->getBusyConnections() << endl;
cout << "Time Out Connection : " << scp->getTimeOut() << endl;
cout << "******************************************************" << endl;
pthread_t tid_1, tid_2;
int err = 0;
err = pthread_create(&tid_1, NULL, displayAllRows, (void *)scp);
if (err != 0) {
cout << "create thread failure for tid_1." << endl;
} else {
cout << ">> create thread successful for tid_1." << endl;
}
err = pthread_create(&tid_2, NULL, updateRow, (void *)scp);
if (err != 0) {
cout << "create thread failure for tid_2." << endl;
} else {
cout << ">> create thread successful for tid_2." << endl;
}
pthread_join(tid_1, (void **)NULL);
pthread_join(tid_2, (void **)NULL);
env->terminateStatelessConnectionPool(scp);
Environment::terminateEnvironment(env);
return 0;
}
void *displayAllRows(void *arg)
{
StatelessConnectionPool *scp = (StatelessConnectionPool *)arg;
for ( ; ; )
{
std::cout << ">>>> displayAllRows thread runing [" << long(pthread_self()) << "]" << std::endl;
Connection *conn = scp->getConnection("");
string sqlStmt = "SELECT * FROM DEPT WHERE DEPTNO=60";
Statement *stmt = conn->createStatement(sqlStmt);
ResultSet *rset = stmt->executeQuery();
try {
while (rset->next()) {
cout << int(rset->getNumber(1)) << " ";
cout << rset->getString(2) << " ";
cout << rset->getString(3) << " ";
cout << endl;
}
}catch(SQLException &ex) {
cout << "display all rows failure." << endl;
cout << ex.getMessage();
cout << endl;
}
sleep(5);
stmt->closeResultSet(rset);
conn->terminateStatement(stmt);
scp->releaseConnection(conn, "");
}
pthread_exit((void *)0);
}
void *updateRow(void *arg)
{
StatelessConnectionPool *scp = (StatelessConnectionPool*)arg;
for ( ; ; )
{
std::cout << ">>> updateRow thread running [" << long(pthread_self()) << "]" << std::endl;
Connection *conn = scp->getConnection("");
string sqlStmt = "UPDATE DEPT SET LOC=:deptLocal WHERE DEPTNO=51";
Statement *stmt = conn->createStatement(sqlStmt);
try {
stmt->setString(1, "ShangHai");
stmt->executeUpdate();
conn->commit();
} catch(SQLException &ex) {
cout << "update row failure." << endl;
cout << ex.getMessage();
cout << endl;
}
conn->terminateStatement(stmt);
scp->releaseConnection(conn, "");
sleep(1);
}
pthread_exit((void *)0);
}
OCCI线程安全的更多相关文章
- 转:c++ Oracle OCCI 编程
原地址http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 找不到具体的出处,只好不写了. OCCI数据库ORACLE编程步骤1. 配置环境(1) ...
- oracle OCCI编程
1. 创建OCCI环境变量 Environment *env = Environment::createEnvironment(); Environment对象的建立必须放在第一位,而且也必须是最后一 ...
- c++ Oracle OCCI 编程
转载备忘:http://blog.sina.com.cn/s/blog_53a72add01015zj4.html 关于occi编程可以参考的链接: http://blog.itpub.net/162 ...
- [ 高并发]Java高并发编程系列第二篇--线程同步
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...
- [高并发]Java高并发编程系列开山篇--线程实现
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相 ...
- 多线程爬坑之路-学习多线程需要来了解哪些东西?(concurrent并发包的数据结构和线程池,Locks锁,Atomic原子类)
前言:刚学习了一段机器学习,最近需要重构一个java项目,又赶过来看java.大多是线程代码,没办法,那时候总觉得多线程是个很难的部分很少用到,所以一直没下决定去啃,那些年留下的坑,总是得自己跳进去填 ...
- Java 线程
线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程.线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源.它与父进程的其他线程共享该进程的所有资 ...
- C++实现线程安全的单例模式
在某些应用环境下面,一个类只允许有一个实例,这就是著名的单例模式.单例模式分为懒汉模式,跟饿汉模式两种. 首先给出饿汉模式的实现 template <class T> class sing ...
- 记一次tomcat线程创建异常调优:unable to create new native thread
测试在进行一次性能测试的时候发现并发300个请求时出现了下面的异常: HTTP Status 500 - Handler processing failed; nested exception is ...
随机推荐
- 初识contiki(2.7版本)
一个偶然的机会,我接触到了contiki这个家伙. Contiki 是一个开源的.高度可移植的.采用 C 语言开发的非常小型的嵌入式操作系统,针对小内存微控制器设计,适用于联网嵌入式系统和无线传感器网 ...
- HDU 5442——Favorite Donut——————【最大表示法+kmp | 后缀数组】
Favorite Donut Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- MVC分页技术
这个是用的插件分页技术 前台引用和js <script type="text/javascript" src="/js/jquery-1.10.2.min.js&q ...
- js中各种距离clientWidth
1: offsetLeft.offsetTop.offsetHeight.offsetWidth 1.1 偏移参照——定位父级offsetParent offsetParent的定义是:与当前元素 ...
- Shader笔记
1,渲染队列值小的先渲染,值大的后渲染 2,zTest,zWrite zTest:LEqua zWrite:On 则:zWrite中,深度值小于深度值缓冲区的值会被通过 参考:http://www.c ...
- Web前端开发规范(一)
1.前言 网页开发技术从1989年开始至今已经走过了20余年,从最初纯粹的学术交流,到门户网站.电子商务网站.博客.E-mail.Web游戏.SNS网站等,以及到如今的移动Web网站(其实可以认为是P ...
- 图片延迟插件 Jquery.lazyload.min.js
当一个页面打开的图片太多,我们可以用jquery的一个延迟加载插件.名为:jquery.lazyload.min.js 使用非常简单,如下: <div style="height:70 ...
- Java—运算符和流程控制语句
运算符优先级: siwtch语句注意事项: switch 后面小括号中表达式的值必须是整型或字符型 case 后面的值可以是常量数值,如 1.2:也可以是一个常量表达式,如 2+2 :但不能是变量或带 ...
- Active Directory域服务备份
此篇介绍如何通过Windows Server Backup工具备份Active Directory域服务 AD 域系统状态 在域控制器上,系统状态通常包括以下内容,但所包含的数据实际上取决于服务器上安 ...
- HDFS文件操作(命令行)
HDFS是一种分布式文件系统,为MapReduce这种框架下的海量数据分布式处理而设计. Hadoop之HDFS文件操作常有两种方式,一种是命令行方式,即Hadoop提供了一套与Linux文件命令类似 ...