[Interest] QThreadPool & writing to the DB

Dmitriy Purgin dpurgin at gmail.com
Tue Aug 19 13:46:20 CEST 2014


Hi,

In addition to what Sze-Howe told, you should consider the backend
used by the Qt database driver. In your case of SQLite you could end
up in a situtation where multiple simultaneous INSERT queries
seriously degrade the performance of SQLite engine which uses file
locks to isolate transactions.

Cheers

2014-08-18 12:26 GMT+06:00 Igor Mironchik <igor.mironchik at gmail.com>:
> Hi.
>
> I want to move write to DB operation to another thread (from the GUI
> thread). And I implemented the following QRunnable:
>
>
> //
>
> // SourcesLogWritter
>
> //
>
>
> class SourcesLogWritter
>
> 	:	public QRunnable
>
> {
>
> public:
>
> 	SourcesLogWritter()
>
> 	{
>
> 		setAutoDelete( false );
>
> 	}
>
>
> 	void setData( const QDateTime & dateTime,
>
> 		const QString & channelName,
>
> 		Como::Source::Type type,
>
> 		const QString & sourceName,
>
> 		const QString & typeName,
>
> 		const QVariant & value,
>
> 		const QString & desc )
>
> 	{
>
> 		m_dateTime = dateTime;
>
> 		m_channelName = channelName;
>
> 		m_type = type;
>
> 		m_sourceName = sourceName;
>
> 		m_typeName = typeName;
>
> 		m_value = value;
>
> 		m_desc = desc;
>
> 	}
>
>
> 	void run()
>
> 	{
>
> 		QSqlQuery insert( QLatin1String(
>
> 			"INSERT INTO sourcesLog ( dateTime, channelName, type, "
>
> 			"sourceName, typeName, value, desc ) "
>
> 			"VALUES ( ?, ?, ?, ?, ?, ?, ? )" ) );
>
>
> 		insert.addBindValue( dateTimeToString( m_dateTime ) );
>
> 		insert.addBindValue( m_channelName );
>
> 		insert.addBindValue( (int) m_type );
>
> 		insert.addBindValue( m_sourceName );
>
> 		insert.addBindValue( m_typeName );
>
> 		insert.addBindValue( m_value.toString() );
>
> 		insert.addBindValue( m_desc );
>
>
> 		insert.exec();
>
> 	}
>
>
> private:
>
> 	QDateTime m_dateTime;
>
> 	QString m_channelName;
>
> 	Como::Source::Type m_type;
>
> 	QString m_sourceName;
>
> 	QString m_typeName;
>
> 	QVariant m_value;
>
> 	QString m_desc;
>
> }; // class SourcesLogWritter
>
> Is it OK to launch this runnable every time when I need to write to the log?
>
> I do the following:
>
> d->m_sourcesLogWritter->setData( dateTime, channelName,
>
>     type, sourceName, typeName, value, desc );
>
>
> QThreadPool::globalInstance()->start(
>
>     d->m_sourcesLogWritter.data() );
>
> And what if previous operation is still not finished and I will launch
> another?
>
> Thanks.
>
>
> _______________________________________________
> Interest mailing list
> Interest at qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>



More information about the Interest mailing list