我们正在Windows 2008服务器场上运行MVC 4 Web应用程序。我们一直在尝试将服务器场升级到Windows 2008 R2 64位服务器,但在iSeries(运行V7R1)上遇到连接池问题。我们经常调用DB2 java存储过程并启用连接池以减少建立连接所需的时间。下面是我们正在使用的连接字符串的示例。
<add name="DB2" connectionString="ConnectionTimeout=45;Pooling=true;MinimumPoolSize=1;MaximumPoolSize=-1;MaximumUseCount=100;CheckConnectionOnOpen=true;DataSource=XXX;Naming=SQL;DataCompression=True;UserID=username;password=pwd;DefaultCollection=XXX" />
自从进入2008R2以来,iSeries上的连接数量(QZDASOINIT作业)不断增加,从而损害了iSeries的性能,从而影响了我们的应用程序。代码库完全与2008 32位服务器上的相同。我们为Any CPU设置了目标平台,并在IIS中将“启用32位应用程序”设置为True。我们试图在本月早些时候升级到这些服务器,并且重置IIS不会像它应该的那样自动终止盒子上的连接,并且在我们完全恢复到旧服务器之前不会创建任何新连接。
似乎它似乎没有获取已经建立的连接并不断创建新的连接。当涉及到与iSeries的连接池时,是否有人知道在升级到32位到64位时是否存在我们错过的步骤?
答案 0 :(得分:7)
回顾问题:将ASP.NET MVC 4 Web应用程序从32位Windows 2008服务器场移动到Windows 2008 R2 64位服务器时,QZDASOINIT
的数量在IBM i上创建的工作从大约2,000个增加到大约200,000个。代码库没有变化,唯一改变的是执行环境。
关于QZDASOINIT
个工作的一些相关事项...默认情况下,这些工作是在子系统QUSRWRK
中创建的(尽管它们也可以在QSYSWRK
和{{1}中突出显示如果QSERVER
子系统在请求ODBC连接时未处于活动状态。 QUSRWRK
配置为在子系统启动后立即创建其中一个QUSRWRK
作业。如果发出ODBC请求且没有QZDASOINIT
个作业可用,则将启动另外2个QZDASOINIT
个作业。每个QZDASOINIT
作业将在结束前处理200个ODBC请求。可以使用QZDASOINIT
或CHGPJE
命令更改所有这些默认值和更多内容。
CHGSBSD
个职位有一两个“班级”。可以使用这些类对这些作业的执行进行微调。
您可以使用QZDASOINIT
命令找到有关当前活动QZDASOINIT
作业的信息。
<强>资源:强>
CHGPJE – Change Prestart Job Entry
CHGSBSD – Change Subsystem Description
DSPACTPJ – Display Active Prestart Jobs
Performance considerations with QZDASOINIT jobs
可能的“解决方案”#1:
在Windows端的连接字符串中,将DSPACTPJ
更改为MaximumPoolSize=-1
,其中XXX是一些允许ASP.NET应用程序运行良好但不会降低性能的数字IBM i。我建议使用2,000,因为当应用程序在32位服务器上运行时似乎可以容忍。
可能的“解决方案”#2:
让IBM i管理员对IBM i进行一些更改 - 因为您知道服务器场的IP地址范围,管理员可以设置一个新的子系统,除了为应用程序ODBC连接提供服务之外什么也不做。
使用MaximumPoolSize=XXX
命令更改允许的QZDASOINIT
作业的最大数量 - 再次,我建议从2,000开始并根据需要进行调整,以满足您的应用程序的性能和对IBM i的影响。如有必要,管理员可以设置一个可以终止新子系统中所有CHGPJE
个作业的作业 - 通过结束该子系统(ENDSBS)或QZDASOINIT
(我会结束子系统,但管理员会知道什么在你的环境中最有效。)
其他一些建议本身并不是解决方案,但可能会有所帮助:
限制ASP.NET应用程序中并发执行线程的数量。显然,这不是一件快速或简单的事情,而是应用于下一次应用程序迭代的注释中。
更改ENDHOSTSVR SERVER(*DATABASE) ENDACTCNN(*DATABASE)
以匹配您在MaximumUseCount=100
个工作中使用的任何使用次数。
我在“解决方案”中加上引号,因为虽然它们可能允许您将应用程序移至新环境,但实际上并未解决问题。
答案 1 :(得分:1)
我之前看到的问题是,使用连接池的应用程序可以正常工作,但是当在应用服务器中运行时,最终应用程序和应用服务器都会进行连接池。问题是app服务器永远不会释放连接。
我对ASP.NET或IIS不够熟悉,无法告诉你在哪里看,但也许上面就足够了。
如果没有,那将有助于了解
您加载了哪个版本的IBM iAccess,而不是32位或64位以及您所使用的服务包级别。
正在使用的驱动程序。我假设.NET驱动程序,但我知道MS提供了使用ODBC或OLEDB驱动程序与.NET的功能
查尔斯
答案 2 :(得分:0)
关闭连接池可能会解决您的问题。在连接字符串中包括:
Pooling=false;