silverlight 数据库中间层

liuliulp 2014-02-27 10:44:59
小弟最近在写一个监控系统,需要每隔2秒钟将数据库里面的数据读取出来显示在datagrid上,使用了启用了Silverlight的WCF服务,由于每打开一个页面都会定时的去访问数据库,在打开20个页面后数据库就不能正常的打开并报错,请问各位大神这个问题该咋个解决呢?能不能创建这样的一个服务:让该服务定时的访问数据库并把结果暂存起来,让每个页面都访问这个结果而不是每次去操作数据库。。。。。。。。刚接触silverlight望各位大神指点,感激不尽。。。。。。。。。
...全文
221 12 打赏 收藏 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
海涵德 2014-03-06
  • 打赏
  • 举报
回复
public partial class MainPage : UserControl { private ServiceReference1.Service1Client _wcf ; public MainPage() { InitializeComponent(); _wcf = new Service1Client(); _wcf.readMonitorInforCompleted +=(s,e)=> { try { dataGrid1.ItemsSource = null; dataGrid1.ItemsSource = e.Result; } catch (Exception error) { MessageBox.Show("网络中断,请检查网络连接!\n" +"在确认网络连接正常后刷新页面!"); timer.Stop(); //MessageBox.Show(error.ToString()); } } } }
海涵德 2014-03-06
  • 打赏
  • 举报
回复
 private void readMonitorInfor()
         {
             EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source, "/AndonInforService.svc"));
             AndonInforServiceClient client = new AndonInforServiceClient(new BasicHttpBinding(), address);
             client.readMonitorInforCompleted += client_readMonitorInforCompleted;
             client.readMonitorInforAsync();
         }
你的wcf的使用是有问题的,最好不要反复的使用新的wcf,这样开销很大的。 应该定义一个全局的 wcf实例,然后每次只是用这个实例,如: 在你的构造函数中
public partial class MainPage : UserControl
{
   private   ServiceReference1.Service1Client _wcf ; 

    public MainPage()
        {
            InitializeComponent();

_wcf = new Service1Client(); 
_wcf.readMonitorInforCompleted +=(s,e)
{
  try
             {
                 dataGrid1.ItemsSource = null;
                 dataGrid1.ItemsSource = e.Result;
             }
             catch (Exception error)
             {
                 MessageBox.Show("网络中断,请检查网络连接!\n" +"在确认网络连接正常后刷新页面!");
                 timer.Stop();
                 //MessageBox.Show(error.ToString());
             }
}
        }   
}
另外对话框和timer.stop不应该出现在这里,因为定时器周期性执行,这里应该发个事件有别的地方处理。 还有,我的回答有一段与你的主题无关的内容,那是回答别人的发到你这里了,见谅。
Bonjour-你好 2014-03-01
  • 打赏
  • 举报
回复
。。。。错误是你自己定义的?!还有client_readMonitorInforCompleted函数里面的try/catch根本没必要,你要知道查询时的错误,参数e中就包含的错误信息了吧。
引用
改用RIA WCF Services吧,性能比WCF好
不知从什么测试中能得出这个结果?
liuliulp 2014-03-01
  • 打赏
  • 举报
回复
引用 7 楼 madaming 的回复:
[quote=引用 楼主 liuliulp 的回复:] 小弟最近在写一个监控系统,需要每隔2秒钟将数据库里面的数据读取出来显示在datagrid上,使用了启用了Silverlight的WCF服务,由于每打开一个页面都会定时的去访问数据库,在打开20个页面后数据库就不能正常的打开并报错,请问各位大神这个问题该咋个解决呢?能不能创建这样的一个服务:让该服务定时的访问数据库并把结果暂存起来,让每个页面都访问这个结果而不是每次去操作数据库。。。。。。。。刚接触silverlight望各位大神指点,感激不尽。。。。。。。。。
为什么要每次打开页面,使用个定时器timer在代码中实现wcf的访问,直接更新datagrid。wcf本身就是访问服务器的,没有必要再创建一个服务。你好像没有正确的使用wcf方式,而是使用了传统aspx方式,后者需要不断的刷新页面,使用了wcf的silverlight访问数据库是不需要刷新页面的。 改用RIA WCF Services吧,性能比WCF好。 [/quote] 表达错了,是直接更新datagrid,代码如下: namespace AndonSystem { public partial class MainPage : UserControl { DispatcherTimer timer = new DispatcherTimer(); public MainPage() { InitializeComponent(); // DispatcherTimer timer = new DispatcherTimer(); timer.Interval = new TimeSpan(0, 0, 1); timer.Tick += new EventHandler(timer_Tick); timer.Start(); } private void timer_Tick(object sender, EventArgs e) { readMonitorInfor(); } private void readMonitorInfor() { EndpointAddress address = new EndpointAddress(new Uri(Application.Current.Host.Source, "/AndonInforService.svc")); AndonInforServiceClient client = new AndonInforServiceClient(new BasicHttpBinding(), address); client.readMonitorInforCompleted += client_readMonitorInforCompleted; client.readMonitorInforAsync(); } private void client_readMonitorInforCompleted(object sender, readMonitorInforCompletedEventArgs e) { try { dataGrid1.ItemsSource = null; dataGrid1.ItemsSource = e.Result; } catch (Exception error) { MessageBox.Show("网络中断,请检查网络连接!\n" +"在确认网络连接正常后刷新页面!"); timer.Stop(); //MessageBox.Show(error.ToString()); } } WCF服务是直接返回一个查询语句的结果,当并发达到20左右时,就会报"网络中断,请检查网络连接!\n" +"在确认网络连接正常后刷新页面!"错误,我估计是同时请求打开数据库的连接太多引起数据库不能正常打开,因为所有页面请求的都是同一个查询数据,所以想让数据库定时查询后将数据保存起来,然后让所有页面访问都使用保存起来的数据,请问有没有什么方法,谢谢。。。PS我已经试着在WCF中建立全局静态类,并没有成功。。。。。
海涵德 2014-03-01
  • 打赏
  • 举报
回复
使用企业级数据库是不分位置的,wcf是通过数据库连接串访问数据库,sqlite如果具有服务功能的,就可以通过连接串访问。 你说的独立存储解决的是文件系统访问的方式问题,浏览器访问客户端文件系统要受到安全策略限制是不能访问文件系统的,只用在程序中使用对话框由用户发起通过流访问单个文件上传或下载。由于既不能通过代码写本地磁盘又不能写客户端内存,所以silverlight引入了独立存储的技术通过cookies机制模拟客户端的访问一个虚拟的文件系统的读写操作。
海涵德 2014-03-01
  • 打赏
  • 举报
回复
引用 楼主 liuliulp 的回复:
小弟最近在写一个监控系统,需要每隔2秒钟将数据库里面的数据读取出来显示在datagrid上,使用了启用了Silverlight的WCF服务,由于每打开一个页面都会定时的去访问数据库,在打开20个页面后数据库就不能正常的打开并报错,请问各位大神这个问题该咋个解决呢?能不能创建这样的一个服务:让该服务定时的访问数据库并把结果暂存起来,让每个页面都访问这个结果而不是每次去操作数据库。。。。。。。。刚接触silverlight望各位大神指点,感激不尽。。。。。。。。。
为什么要每次打开页面,使用个定时器timer在代码中实现wcf的访问,直接更新datagrid。wcf本身就是访问服务器的,没有必要再创建一个服务。你好像没有正确的使用wcf方式,而是使用了传统aspx方式,后者需要不断的刷新页面,使用了wcf的silverlight访问数据库是不需要刷新页面的。 改用RIA WCF Services吧,性能比WCF好。
liuliulp 2014-03-01
  • 打赏
  • 举报
回复
引用 5 楼 pan512 的回复:
在WCF 加个缓存,调用时先访问缓存是否有数据,缓存有数据直接返回结果,缓存没数据查才到数据库去查; 如果数据实时变化在WCF加一个定时刷新缓存的东东就OK了
我现在在WCF中新建了一个全局静态类用来临时储存我定时从数据库读取的数据,每次页面请求的也是这个数据,Wcf模式设置成单例模式,不过打开不同的页面时还是会得到不同结果。。。。。。。。。还有就是上面提到的缓存,能不能详细一点点,刚接触WCF不是很了解,谢谢
Bonjour-你好 2014-02-28
  • 打赏
  • 举报
回复
你的方法可以啊,不过如果你的结果是不停累加,就要注意了。也可以让WCF服务把结果写进文件,客户访问服务就读取文件返回结果。总之,通过测试,方能知道哪种办法好。
liuliulp 2014-02-28
  • 打赏
  • 举报
回复
引用 2 楼 KumaPower 的回复:
还有,看楼主之前的帖,大概之前是机器问题?现在说是打开20个页面后出现问题,这里面也许有代码的问题,如没有及时断开数据库连接,或数据库所在计算机内存不足,貌似也会拒绝查询的。
谢谢你的回答,之前的确是第三台机器有问题,现在我想在wcf服务中加入全局变量之类的,可以让每个页面访问的时候都访问同一变量,不知道师兄有没有什么建议,谢谢
pan512 2014-02-28
  • 打赏
  • 举报
回复
在WCF 加个缓存,调用时先访问缓存是否有数据,缓存有数据直接返回结果,缓存没数据查才到数据库去查; 如果数据实时变化在WCF加一个定时刷新缓存的东东就OK了
Bonjour-你好 2014-02-27
  • 打赏
  • 举报
回复
还有,看楼主之前的帖,大概之前是机器问题?现在说是打开20个页面后出现问题,这里面也许有代码的问题,如没有及时断开数据库连接,或数据库所在计算机内存不足,貌似也会拒绝查询的。
Bonjour-你好 2014-02-27
  • 打赏
  • 举报
回复
感觉楼主已经回答了自己的问题

8,757

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧