Many thanks for your instant help so far! I will run a few tests actually I use on single class instantiation and each thread has an pointer to the object. The code I put below is incomplete but describes the standard behavoir in all the database methods, I don't want to give full access to the db, only some functionalities should be accessable. So the structure is somehow like this:
Main: Creates an instance to the DB and opens it. All Threads using the database are started here and get a pointer to this single instance. Within the instance only methods like: int getAttributeID (int id) are accessable. To ensure that there are not 2 requests at the same time I manually put mutexes at the beginning of each function which will block until the mutex is available. At the end of each function or before I return from the function I release the mutex in order to give access to the next request. Correct me if I'm wrong but I guess there could not be any call to a function at the same time beside I miss to set/release a mutex in one of these functions. Best regards, Chris -------- Original-Nachricht -------- > Datum: Fri, 28 Oct 2011 12:51:21 +0000 > Von: "Black, Michael (IS)" <michael.bla...@ngc.com> > An: General Discussion of SQLite Database <sqlite-users@sqlite.org> > Betreff: Re: [sqlite] Segmentation Fault on SQLITE3_exex > What you're showing should basically work as long it's not a single class > instantiation being used by multiple threads. > Also, your missing a bind on the 2nd statement. > And you're not retrieving the results of the query (I assume you left that > out for brevity). > > What I would do is this to maximize speed...you keep the prepared > statement around for each query and reuse it. > Somebody else may have a better idea. But hopefully this shows how to > "reuse" a prepared statement. > > > db = MyDBClass("mydb.sqlite"); // opens database > run_threads(); // you did say you have threads so kick them off > > // here's what a thread would look like -- note that I don't have complete > error checking in here for brevity > thread() > { > pStmt1=db->getPreparedStatement("SELECT * from model where id=?"); > pStmt2=db->getPreparedStatement("SELECT * from type where id=?"); > while (1) { // or whatever loop you're running > // 1st query > sqlite3_bind_int (pStmt1, 1, dd.deviceIndex); > doStmt(pStmt1); > int myIndex=sqlite3_column_int(pStmt1,0); > // 2nd query > sqlite3_bind_int (pStmt2, 1, dd.deviceIndex); > doStmt(pStmt2); > int myType=sqlite3_column_int(pStmt2,0); > } > sqlite3_finalize(pStmt1); > sqlite3_finalize(pStmt2); > } > > doStmt(sqlite3_stmt *pStmt) > { > sqlite3_reset(pStmt); // we reset on the way in so we can use the > results AFTER we step outside this function > sqlite3_step(pStmt); > } > > Michael D. Black > Senior Scientist > Advanced Analytics Directorate > Advanced GEOINT Solutions Operating Unit > Northrop Grumman Information Systems > > > > From: sqlite-users-boun...@sqlite.org [sqlite-users-boun...@sqlite.org] on > behalf of Christian [siriu...@gmx.de] > Sent: Friday, October 28, 2011 3:07 AM > To: General Discussion of SQLite Database; sqlite-users@sqlite.org > Subject: EXT :Re: [sqlite] Segmentation Fault on SQLITE3_exex > > > First of all thanks for your detailed reply! According to the > documentation its not recommended to reuse a preparedStatement after > finalizing it. So > my initial guess to do something like this: > > sqlite3_stmt *preparedStatement = 0; > static char command [1024]; > > sprintf (command, "SELECT * from model where id=?"); > > if (sqlite3_prepare_v2 (db, command, strlen(command), &preparedStatement, > 0) != SQLITE_OK) > { > LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db), > sqlite3_errcode (db)); > sqlite3_finalize (preparedStatement); > return FALSE; > } > sqlite3_bind_int (preparedStatement, 1, dd.deviceIndex); > success = sqlite3_step(preparedStatement); > > //read result > > if ((retVal= sqlite3_finalize(preparedStatement)) != SQLITE_OK){ > LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db), > sqlite3_errcode (db)); > } > else > preparedStatement=0; > > > sprintf (command, "SELECT * FROM type WHERE id=%d", id); > > if (sqlite3_prepare_v2 (db, command, strlen(command), &preparedStatement, > 0) != SQLITE_OK) > { > LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db), > sqlite3_errcode (db)); > sqlite3_finalize (preparedStatement); > return FALSE; > } > if ((success = sqlite3_step(preparedStatement)) != SQLITE_ROW) > { > LOG_MESSAGE ("SQLite Error: %s error=%d\n", sqlite3_errmsg (db), > sqlite3_errcode (db)); > sqlite3_finalize (preparedStatement); > return FALSE; > } > > //read result > > sqlite3_finalize (preparedStatement); > return TRUE; > > > Am I right that this is not possible? So I have to use one sqlite3_stmt > for each prepare? > > Best regards, > Chris. > > _______________________________________________ > sqlite-users mailing list > sqlite-users@sqlite.org > http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users -- NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie! Jetzt informieren: http://www.gmx.net/de/go/freephone _______________________________________________ sqlite-users mailing list sqlite-users@sqlite.org http://sqlite.org:8080/cgi-bin/mailman/listinfo/sqlite-users