当前我写了一个程序,10个线程并发数据库,对数据库中的一张表进行插入。每秒估计有500条数据。数据库死掉,并且服务器挂了。在试了5个线程,一样的结果。试了2个线程,可以执行。
本人觉得自己的服务器配置还算可以。请求高手来看看问题。
21 个解决方案
#1
每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?
#2
#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。
#3
最多是排队处理,也不会死掉。当这样写入时,日志写入是瓶颈
#4
你是什么写的,有没有用到事务处理?
begin tran
commit tran
或
rollback tran
begin tran
commit tran
或
rollback tran
#5
估计是多种原因诱发引起:
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收
#6
总共500条
#7
500条/秒的数据量,对SQL SERVER来讲,根本不是问题。
是否有链接没释放?
总之,楼主还是自己一步步分析下原因。
#8
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。
#9
LZ最好把测试程序代码和出错信息帖出来看看喔.
#10
整个数据库 和数据库所在的服务器都挂掉。
--> 查看一下windows日志和SQL日志,有错误信息.
--> 查看一下windows日志和SQL日志,有错误信息.
#11
主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。
#12
没有出错,而且数据库日志也没有报错。当我开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
#13
不是,是我随机生成的,如果是主键有问题的话,那程序会报错的,也不至于数据库崩掉啊!
一个线程一个连接对象,而且我的数据库没有设置并发个数,应该是无限制连接。只有当数据库无法承受压力时才会不能连接,我想微软的数据库没有这么差吧,10个都连接不了,那也太差了吧。
#14
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
#15
--#1.有主键的话,且非自增,当INSERT语句插入时,会相互阻塞(前提是你的随机主键没有默认值,而是程序插入的)。
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……
#16
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?
#17
这就是为什么公司需要DBA,就是因为开发人员搞不定。
#18
不可能那么差吧
#19
非常感谢
#20
开启我的程序,过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数据太小。。。
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。
#3
最多是排队处理,也不会死掉。当这样写入时,日志写入是瓶颈
#4
你是什么写的,有没有用到事务处理?
begin tran
commit tran
或
rollback tran
begin tran
commit tran
或
rollback tran
#5
估计是多种原因诱发引起:
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收
1、SQLSERVER2008数据库是有连接池的,你线程多了,导致连接数超过了连接池的最大连接数,这样导致后续的线程连接中断,引起程序异常;
2、10个线程并发访问数据库,插入,可能是你一条条插入,导致数据库连接超时,引起异常
如果你想用多线程并发访问,建议使用线程池,这样程序中会自动的帮你管理各个线程的派发和回收
#6
每秒估计有500条数据,是10个线程总和是插入500条,还是每个线程可能会插入500条数据呢?
总共500条
#7
总共500条
500条/秒的数据量,对SQL SERVER来讲,根本不是问题。
是否有链接没释放?
总之,楼主还是自己一步步分析下原因。
#8
#1.是一条一条插入?
#2.表中是否有主键,或唯一索引?如何定义的
#3.数据库死掉,服务器挂掉,指的是数据库服务器?看下WINDOWS和SQL SERVER ERROR LOG,里面是如何描述错误信息的
#4.个人感觉,可能是因为你写的代码里,需要的连接数太多了,或者没开启连接池,或连接池MaxPool数据太小。。。
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。
#9
LZ最好把测试程序代码和出错信息帖出来看看喔.
#10
整个数据库 和数据库所在的服务器都挂掉。
--> 查看一下windows日志和SQL日志,有错误信息.
--> 查看一下windows日志和SQL日志,有错误信息.
#11
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。
主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。
#12
LZ最好把测试程序代码和出错信息帖出来看看喔.
没有出错,而且数据库日志也没有报错。当我开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
#13
1,是一条一条插入,2,有主键。3,整个数据库 和数据库所在的服务器都挂掉。
主键是如何定义的?是自增列吗?单个线程里,每个插入语句,用的连接对象是一个吧?
把你的线程中的相关插入代码发上来看看。
不是,是我随机生成的,如果是主键有问题的话,那程序会报错的,也不至于数据库崩掉啊!
一个线程一个连接对象,而且我的数据库没有设置并发个数,应该是无限制连接。只有当数据库无法承受压力时才会不能连接,我想微软的数据库没有这么差吧,10个都连接不了,那也太差了吧。
#14
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
#15
--#1.有主键的话,且非自增,当INSERT语句插入时,会相互阻塞(前提是你的随机主键没有默认值,而是程序插入的)。
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……
--#2.如果#1成立,不管你多少个线程同时进行,都相当于INSERT排队插入。
--#3.对于单个线程,里面的SQL肯定是一个一个执行的,也就是说,同时最多有10个数据库连接同时连接数据库。那么连接数据的问题,应该也不存在。
呵呵,分析不下去了……
#16
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?
#17
这就是为什么公司需要DBA,就是因为开发人员搞不定。
#18
不可能那么差吧
#19
非常感谢
#20
开启我的程序,过2-3秒后,数据库就会动不了,然后数据库所在的服务器也就挂掉了。
--> 估计是程序的问题,不是MSSQL设定的问题.请贴程序代码吧?
我怀疑是不是哪里陷入死循环,无限开启数据库连接.导致服务器内存耗尽,然后挂掉.
应该不会吧,如果是这样的话,那两个线程的时候为什么不会挂掉呢?
问题解决了没?两个线程的时候为什么不会挂掉?没什么奇怪的哦,可能性很多。
我建议你,
第一步,
先把开10个线程时候的代码跟开2个线程时候的代码给出再说。
#21
问题已经找到了。好像是操作系统的原因。或许是我同事程序的问题。他的JAVA程序在windows2003环境下,访问的服务器系统为2003时,100个线程都没有问题。但访问windows2008时,就不行了。并且这个和数据库版本没有关系。但具体同事说,他说什么java不分32位和64位。我一个做.net的就不懂了。随后我自己写了个.net的测试程序。不管程序放在32还是64上都可以。但我同事还是觉得系统的问题。懂JAVA的大神。能不能解释下!