20080424 Application Lock ApplicationContext spring
http://www.yippeesoft.com

Application的Lock问题。
原因
嵌入到 Application.Lock 和 Application.UnLock 方法中代码提供多用户环境中保护。 访问 Application 对象时随着是 COM +, 引入 Internet Information Server (IIS) 5.0 利用是线程 Neutral Apartment (NA)。 当您明确调用 Application.Lock 和从 Application.UnLock 组件, 内会因此, 某些情况下您可能遇到死锁情况导致服务器停止响应。 当内部 ASP 函数是整理来回 IIS 服务器和 COM+ 应用程序服务器之间是最常发生此问题。 以下两种方案可能导致服务器到挂起:
• 当您调试 MicrosoftVisualBasic 组件从 VisualBasic 集成开发 Envrionment (IDE)。
• 当您调用组件, 作为在 COM+ 服务器应用程序运行。

解决方案
Application.Lock 和 Application.UnLock 方法不需要分配单个 Application 变量因为内部调用方法。

如果您需要从组件, 分配同一 Application.Lock 和 Application.UnLock 方法中多 Application 变量组件必须与调用方, 在同一进程中运行或必须修改您逻辑以只包含一个赋值。 例如, 以下代码

Application.Lock
Application("myvar1") = "hello"
Application("myvar2") = "world"
Application.UnLock
    

可能被修改以解决此问题如下:

Dim array(1)
array(0) = "hello"
array(1) = "world"
Application("myvar") = array
    

    Lock 方法阻止其他客户修改存储在 Application 对象中的变量,以确保在同一时刻仅有一个客户可修改和存取 Application 变量。如果用户没有明确调用 Unlock 方法,则服务器将在 .asp 文件结束或超时后即解除对 Application 对象的锁定。
语法

Application.Lock
 

示例

<%
Application.Lock
Application("NumVisits") = Application("NumVisits") + 1
Application.Unlock
%>
 
This application page has been visited
<%= Application("NumVisits") %>  times!

在前面的示例中,Lock 方法保护变量 NumVisits 在同一时刻不被多个客户所访问。如果应用程序未被锁定,则两个客户就可以同时增加变量 NumVisits 的值。

应用程序需要小心使用复杂对象,例如,集合.集合没有被设计为供多线程同时访问.

利用方法Synchronized()创建集合对象线程安全版本

SortedList ApplicationValue =new SortedList();

ApplicationValue.Add("1","a");

ApplicationValue.Add("2","b");

ApplicationValue.Add("3","c");

ApplicationValue=SortedList.Synchronized(ApplicationValue);

package com.test;

import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.FileSystemResource;

public class SpringMain &leftsign;

 /**
  * @param args
  */
 public static void main(String[] args) &leftsign;
  SpringBean bean = null;
  XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("applicationContext.xml"));
  bean = (SpringBean)factory.getBean("test1");
  bean.sayHello();
  
  ApplicationContext act = new ClassPathXmlApplicationContext("applicationContext.xml");
  bean = (SpringBean)act.getBean("test1");
  bean.sayHello();
  
  factory = new XmlBeanFactory(new FileSystemResource("F:\\\\ccc\\\\workspace_zuhe\\\\Test\\\\src\\\\applicationContext.xml"));
  bean = (SpringBean)factory.getBean("test1");
  bean.sayHello();
 &rightsign;

&rightsign;

历史博文

标签:, ,
一月 16, 2009 at 9:52 上午 by yippee 1,012 次
Category: Dev
Tags: , ,