SQLSERVER数据库高并发

时间:2022-08-17 21:42:18
当前环境  服务器--双8核CPU  内存17810M WIN8系统  SQLSERVER2008数据库

当前我写了一个程序,10个线程并发数据库,对数据库中的一张表进行插入。每秒估计有500条数据。数据库死掉,并且服务器挂了。在试了5个线程,一样的结果。试了2个线程,可以执行。

本人觉得自己的服务器配置还算可以。请求高手来看看问题。

21 个解决方案

#1


每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?

#2


#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。

#3


最多是排队处理,也不会死掉。当这样写入时,日志写入是瓶颈

#4


你是什么写的,有没有用到事务处理?
begin tran


commit tran

rollback tran

#5


估计是多种原因诱发引起:
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收

#6


引用 1 楼 yupeigu 的回复:
每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?



总共500条

#7


引用 6 楼 cnl432 的回复:
总共500条

500条/秒的数据量,对SQL SERVER来讲,根本不是问题。
是否有链接没释放?
总之,楼主还是自己一步步分析下原因。

#8


引用 2 楼 wwwwgou 的回复:
#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。


1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

#9


LZ最好把测试程序代码和出错信息帖出来看看喔.
SQLSERVER数据库高并发

#10


整个数据库 和数据库所在的服务器都挂掉。 
--> 查看一下windows日志和SQL日志,有错误信息.

#11


引用 8 楼 cnl432 的回复:
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。

#12


引用 9 楼 ap0405140 的回复:
LZ最好把测试程序代码和出错信息帖出来看看喔.
SQLSERVER数据库高并发


没有出错,而且数据库日志也没有报错。当我开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。

#13


引用 11 楼 wwwwgou 的回复:
Quote: 引用 8 楼 cnl432 的回复:

1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。


不是,是我随机生成的,如果是主键有问题的话,那程序会报错的,也不至于数据库崩掉啊!

一个线程一个连接对象,而且我的数据库没有设置并发个数,应该是无限制连接。只有当数据库无法承受压力时才会不能连接,我想微软的数据库没有这么差吧,10个都连接不了,那也太差了吧。

#14


开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.

#15


--#1.有主键的话,且非自增,当INSERT语句插入时,会相互阻塞(前提是你的随机主键没有默认值,而是程序插入的)。
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……

#16


引用 14 楼 ap0405140 的回复:
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.



应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?

#17


这就是为什么公司需要DBA,就是因为开发人员搞不定。

#18


不可能那么差吧

#19


非常感谢 SQLSERVER数据库高并发

#20


引用 16 楼 cnl432 的回复:
Quote: 引用 14 楼 ap0405140 的回复:

开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.



应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?

问题解决了没?两个线程的时候为什么不会挂掉?没什么奇怪的哦,可能性很多。
我建议你,
第一步,
先把开10个线程时候的代码跟开2个线程时候的代码给出再说。

#21


问题已经找到了。好像是操作系统的原因。或许是我同事程序的问题。他的JAVA程序在windows2003环境下,访问的服务器系统为2003时,100个线程都没有问题。但访问windows2008时,就不行了。并且这个和数据库版本没有关系。但具体同事说,他说什么java不分32位和64位。我一个做.net的就不懂了。随后我自己写了个.net的测试程序。不管程序放在32还是64上都可以。但我同事还是觉得系统的问题。懂JAVA的大神。能不能解释下!

#1


每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?

#2


#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。

#3


最多是排队处理,也不会死掉。当这样写入时,日志写入是瓶颈

#4


你是什么写的,有没有用到事务处理?
begin tran


commit tran

rollback tran

#5


估计是多种原因诱发引起:
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收

#6


引用 1 楼 yupeigu 的回复:
每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?



总共500条

#7


引用 6 楼 cnl432 的回复:
总共500条

500条/秒的数据量,对SQL SERVER来讲,根本不是问题。
是否有链接没释放?
总之,楼主还是自己一步步分析下原因。

#8


引用 2 楼 wwwwgou 的回复:
#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。


1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

#9


LZ最好把测试程序代码和出错信息帖出来看看喔.
SQLSERVER数据库高并发

#10


整个数据库 和数据库所在的服务器都挂掉。 
--> 查看一下windows日志和SQL日志,有错误信息.

#11


引用 8 楼 cnl432 的回复:
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。

#12


引用 9 楼 ap0405140 的回复:
LZ最好把测试程序代码和出错信息帖出来看看喔.
SQLSERVER数据库高并发


没有出错,而且数据库日志也没有报错。当我开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。

#13


引用 11 楼 wwwwgou 的回复:
Quote: 引用 8 楼 cnl432 的回复:

1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。 

主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。


不是,是我随机生成的,如果是主键有问题的话,那程序会报错的,也不至于数据库崩掉啊!

一个线程一个连接对象,而且我的数据库没有设置并发个数,应该是无限制连接。只有当数据库无法承受压力时才会不能连接,我想微软的数据库没有这么差吧,10个都连接不了,那也太差了吧。

#14


开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.

#15


--#1.有主键的话,且非自增,当INSERT语句插入时,会相互阻塞(前提是你的随机主键没有默认值,而是程序插入的)。
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……

#16


引用 14 楼 ap0405140 的回复:
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.



应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?

#17


这就是为什么公司需要DBA,就是因为开发人员搞不定。

#18


不可能那么差吧

#19


非常感谢 SQLSERVER数据库高并发

#20


引用 16 楼 cnl432 的回复:
Quote: 引用 14 楼 ap0405140 的回复:

开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
    我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.



应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?

问题解决了没?两个线程的时候为什么不会挂掉?没什么奇怪的哦,可能性很多。
我建议你,
第一步,
先把开10个线程时候的代码跟开2个线程时候的代码给出再说。

#21


问题已经找到了。好像是操作系统的原因。或许是我同事程序的问题。他的JAVA程序在windows2003环境下,访问的服务器系统为2003时,100个线程都没有问题。但访问windows2008时,就不行了。并且这个和数据库版本没有关系。但具体同事说,他说什么java不分32位和64位。我一个做.net的就不懂了。随后我自己写了个.net的测试程序。不管程序放在32还是64上都可以。但我同事还是觉得系统的问题。懂JAVA的大神。能不能解释下!