请教如何进行多线程连接数据库并写入数据

请教如何进行多线程连接数据库并写入数据,第1张

#include <QCoreApplication>

#include "threadh"

#include <QVector>

#include <QDebug>

int main(int argc, char argv[])

{

QCoreApplication a(argc, argv);

QVector<Thread> vector;

Thread thread;

//创建多个线程,并start

for(int i=0;i<10;i++){

thread=new Thread;

vectorappend(thread);

thread->set(i);

thread->start();

}

//等待所有线程执行完,然后删除线程

foreach(thread,vector){

thread->wait();

}

foreach(thread,vector){

delete thread;

}

return aexec();

}

-------------------------------------------------------------------------------------------------

#include "threadh"

Thread::Thread(QObject parent) : QThread(parent)

{

}

void Thread::run()

{

begin();

}

//为每个线程创建一个连接名

void Thread::set(int a)

{

connectionName=QString::number(a);

}

void Thread::connectionDatabase(QString dbName)

{

QSqlDatabasedb=QSqlDatabase::addDatabase("QMYSQL",connectionName);

dbsetHostName("localhost");

dbsetDatabaseName(dbName);

dbsetUserName("root");

dbsetPassword("");

if(!dbopen())

qDebug()<<"db open fail";

}

void Thread::begin()

{

QString dbName="learnsql";

connectionDatabase(dbName);

QSqlDatabase db=QSqlDatabase::database(connectionName);

dbtransaction(); //开启事物

QSqlQuery query(db);

//向表student中插入10000条数据

for(int i=1;i<=10000;i++){

queryexec("insert into student values(1)");

}

dbcommit(); //提交事物

}

用insert语句: INSERT INTO table1(id, name, address) VALUES(1, ygl, 'beijing'),该语句主要适用于sql和PL/SQL。

数据库(Database)是按照数据结构来组织、存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展而发展。目前,数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用。

结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。

添加数据需要知道往哪张表添加,以及自己要添加的内容,然后可用insert语句执行。1、以sqlserver2008r2为例,登录SQL Server Management Studio到指定的数据库。2、登录后点击“新建查询”。3、比如要往test表中插入数据,可先用如下语句查看一下表结构及表内数据:1select from test;4、根据自己的实际情况添加输入,比如要添加一条“16,du小小动”的数据。1insert into test (id,name) values (16,'du小小动');执行成功后会有提示:5、此时数据库中数据如下,说明添加成功。

在MySQL 80 之前, 我们假设一下有一条烂SQL,

mysqlselect from t1 order by rand() ;

以多个线程在跑,导致CPU被跑满了,其他的请求只能被阻塞进不来。那这种情况怎么办?

大概有以下几种解决办法:

设置max_execution_time 来阻止太长的读SQL。那可能存在的问题是会把所有长SQL都给KILL 掉。有些必须要执行很长时间的也会被误杀。

自己写个脚本检测这类语句,比如order by rand(), 超过一定时间用Kill query thread_id 给杀掉。

那能不能不要杀掉而让他正常运行,但是又不影响其他的请求呢?

那mysql 80 引入的资源组(resource group,后面简写微RG)可以基本上解决这类问题。

比如我可以用 RG 来在SQL层面给他限制在特定的一个CPU核上,这样我就不管他,让他继续运行,如果有新的此类语句,让他排队好了。

为什么说基本呢?目前只能绑定CPU资源,其他的暂时不行。

那我来演示下如何使用RG。

创建一个资源组user_ytt 这里解释下各个参数的含义,

type = user 表示这是一个用户态线程,也就是前台的请求线程。如果type=system,表示后台线程,用来限制mysql自己的线程,比如Innodb purge thread,innodb read thread等等。

vcpu 代表cpu的逻辑核数,这里0-1代表前两个核被绑定到这个RG。可以用lscpu,top等列出自己的CPU相关信息。

thread_priority 设置优先级。user 级优先级设置大于0。

mysqlmysql> create resource group user_ytt type = user  vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (003 sec)

RG相关信息可以从 information_schemaresource_groups 系统表里检索。

mysqlmysql> select from information_schemaresource_groups;+---------------------+---------------------+------------------------+----------+-----------------+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+---------------------+---------------------+------------------------+----------+-----------------+| USR_default         | USER                |                      1 | 0-3      |               0 || SYS_default         | SYSTEM              |                      1 | 0-3      |               0 || user_ytt            | USER                |                      1 | 0-1      |              19 |+---------------------+---------------------+------------------------+----------+-----------------+3 rows in set (000 sec)

我们来给语句select guid from t1 group by left(guid,8) order by rand() 赋予RG user_ytt。

mysql> show processlist;+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+| Id  | User            | Host      | db   | Command | Time  | State                  | Info                                                      |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+|   4 | event_scheduler | localhost | NULL | Daemon  | 10179 | Waiting on empty queue | NULL                                                      || 240 | root            | localhost | ytt  | Query   |   101 | Creating sort index    | select guid from t1 group by left(guid,8) order by rand() || 245 | root            | localhost | ytt  | Query   |     0 | starting               | show processlist                                          |+-----+-----------------+-----------+------+---------+-------+------------------------+-----------------------------------------------------------+3 rows in set (000 sec)

找到连接240对应的thread_id。

mysqlmysql> select thread_id from performance_schemathreads where processlist_id = 240;+-----------+| thread_id |+-----------+|       278 |+-----------+1 row in set (000 sec)

给这个线程278赋予RG user_ytt。没报错就算成功了。

mysqlmysql> set resource group user_ytt for 278;Query OK, 0 rows affected (000 sec)

当然这个是在运维层面来做的,我们也可以在开发层面结合 MYSQL HINT 来单独给这个语句赋予RG。比如:

mysqlmysql> select /+ resource_group(user_ytt) /guid from t1 group by left(guid,8) order by rand()8388602 rows in set (4 min 4609 sec)

RG的限制:

Linux 平台上需要开启 CAPSYSNICE 特性。比如我机器上用systemd 给mysql 服务加上

systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE

mysql 线程池开启后RG失效。

freebsd,solaris 平台thread_priority 失效。

目前只能绑定CPU,不能绑定其他资源。

1、使用菜单创建易数据库也称手工创建易数据库,选择点击菜单“数据库”——“结构编辑器”,会d出数据库结构管理器界面,然后插入字段信息,定义名称、类型、字段长度。插入若干需要的字段,并定义名称、类型、字段长度,保存并为数据库命名。

2、利用数据库结构管理器,可以对字段进行修改:在“字段数”列表框中选择需要修改的字段,在“字段信息”分组框中修改。还可以上、下移动调整字段位置。

3、数据库结构管理器还可以新建索引、新建数据库表、给数据库设置密码、打开已有数据库、保存当前数据库、关闭数据库结构管理器等功能。

html是一种静态语言。不能直接读取数据库里的内容。

如果要读数据库。你必须会一些简单的phpasp之类。这些是服务器端的程序语言,可以 *** 作数据库的是这个。而html是客户端的。肯定不能 *** 作数据库。

Public cn As ADODBConnection

Public rs As ADODBRecordset

Public cc As String

Sub aa()

Set cn = New ADODBConnection

Set rs = New ADODBRecordset

cc = "Provider=SQLOLEDB1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=library" ‘这里要改成连接的数据库。

cnOpen cc

End Sub

以上是模块代码。

Private Sub Command1_Click()

If Text1Text = "" Then

MsgBox "请输入商品ID!"

Text1SetFocus

Exit Sub

End If

If Text2Text = "" Then

MsgBox "请输入商品名称!"

Text2SetFocus

Exit Sub

End If

If Text3Text = "" Then

MsgBox "请输入商品价格!"

Text3SetFocus

Exit Sub

End If

sql = "select from goods where goodid='" & Text1Text & "'"

Set rs = New ADODBRecordset

rsOpen sql, cn, 1, 3

If rsEOF Then

rsAddNew

rsFields(0) = Text1Text

rsFields(1) = Text2Text

rsFields(2) = Text3Text

rsUpdate

MsgBox "商品信息添加成功!"

Text1Text = ""

Text2Text = ""

Text3Text = ""

Text1SetFocus

Else

MsgBox "此ID已存在,请输入新ID!"

Text1Text = ""

Text1SetFocus

End If

rsClose

Set rs = Nothing

End Sub

Private Sub Form_Load()

Call aa

End Sub

以上是窗体代码。

你好好看一下,这是一个正确的源代码。

写Java程序时经常碰到要读如txt或写入txt文件的情况,但是由于要定义好多变量,经常记不住,每次都要查,特此整理一下,简单易用,方便好懂!

[java] view plain copy

package eduthukeywordtest;  

  

import javaioFile;  

import javaioInputStreamReader;  

import javaioBufferedReader;  

import javaioBufferedWriter;  

import javaioFileInputStream;  

import javaioFileWriter;  

  

public class cin_txt {  

    static void main(String args[]) {  

        try { // 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw  

  

            / 读入TXT文件 /  

            String pathname = "D:\\twitter\\13_9_6\\dataset\\en\\inputtxt"; // 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径  

            File filename = new File(pathname); // 要读取以上路径的input。txt文件  

            InputStreamReader reader = new InputStreamReader(  

                    new FileInputStream(filename)); // 建立一个输入流对象reader  

            BufferedReader br = new BufferedReader(reader); // 建立一个对象,它把文件内容转成计算机能读懂的语言  

            String line = "";  

            line = brreadLine();  

            while (line != null) {  

                line = brreadLine(); // 一次读入一行数据  

            }  

  

            / 写入Txt文件 /  

            File writename = new File("\\result\\en\\outputtxt"); // 相对路径,如果没有则要建立一个新的output。txt文件  

            writenamecreateNewFile(); // 创建新文件  

            BufferedWriter out = new BufferedWriter(new FileWriter(writename));  

            outwrite("我会写入文件啦\r\n"); // \r\n即为换行  

            outflush(); // 把缓存区内容压入文件  

            outclose(); // 最后记得关闭文件  

  

        } catch (Exception e) {  

            eprintStackTrace();  

        }  

    }  

}

以上就是关于请教如何进行多线程连接数据库并写入数据全部的内容,包括:请教如何进行多线程连接数据库并写入数据、在数据库里面插入数据的语句怎么写、如何直接往系统中数据库表插入数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9776795.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存