play框架如何重用代码及发现的问题
2015-11-26 10:47
274 查看
记得上个月读过一篇关于play框架如何重用代码的文章,后来怎么也找不到了。这个月做了一些尝试,效果还是比较明显的,今天做一下总结。
1、play框架默认分Control、models、views三部分,直接用,开发速度是挺快,但是存在一个大的问题:代码如何共用的问题。
首先可重用的代码一般变化频率是比较低的,这部分抽出来比较好,将来好维护,也容易重用。
(1)一些公共逻辑代码如果都放到Control里,很难重用,而且这里面的代码经常随着界面的变化而变化,修改频率很高。
(2)公共逻辑代码放到models里,对象太大,models里面的类经常性的变动,修改频率也很高。
我新建一个中间的逻辑层包,下面放逻辑类,然后把可重用的逻辑都放这里面,这样修改的频率小、可重用性高,比前面的两种办法都要好很多。
可是发现一问题:
这个中间逻辑类里面的函数,究竟是要不要弄成static,play框架本身将很多方法设成静态的,就是为了避免对象的频繁创建,这些方法都是被重复使用的,所以这些方法里面一般情况下是不能加锁的。特别是在controller的action中,使用锁和线程要特别小心,最好不要使用。这是因为play在处理多个请求时,实际上是复用一个线程,而不像很多平台框架,都是每个请求建一个线程。play框架就是为了避免对象、方法的频繁创建,节约这部分资源。
那么一个新问题又来了:我写的这个逻辑类,究竟要不要用static?
目前没有这方面的经验和资料,我先按照play的逻辑来处理吧,毕竟这样做,节约了频繁创建类和对象的步骤,速度绝对会快。
如果哪一天真需要加锁和开线程的话,那么我可以讲函数的static去掉,对象引用一下就OK了。这篇文章我先留在这里,再过几个月,看看这样做有多少好处。
备注一下另外的资料:以下这种方式在Controller就不能用。
play框架在处理所有请求时,只是用了若干个有限的线程进行线程复用,个数一般和CPU核心相等,主要是为了提高性能,比较频繁的创建和销毁线程是比较重的行为。像上面的例子在play里不能那么写,需要换个方式。play引入了await方法和Promise对象,Promise继承了java并发框架中的Future。
1、play框架默认分Control、models、views三部分,直接用,开发速度是挺快,但是存在一个大的问题:代码如何共用的问题。
首先可重用的代码一般变化频率是比较低的,这部分抽出来比较好,将来好维护,也容易重用。
(1)一些公共逻辑代码如果都放到Control里,很难重用,而且这里面的代码经常随着界面的变化而变化,修改频率很高。
(2)公共逻辑代码放到models里,对象太大,models里面的类经常性的变动,修改频率也很高。
我新建一个中间的逻辑层包,下面放逻辑类,然后把可重用的逻辑都放这里面,这样修改的频率小、可重用性高,比前面的两种办法都要好很多。
可是发现一问题:
这个中间逻辑类里面的函数,究竟是要不要弄成static,play框架本身将很多方法设成静态的,就是为了避免对象的频繁创建,这些方法都是被重复使用的,所以这些方法里面一般情况下是不能加锁的。特别是在controller的action中,使用锁和线程要特别小心,最好不要使用。这是因为play在处理多个请求时,实际上是复用一个线程,而不像很多平台框架,都是每个请求建一个线程。play框架就是为了避免对象、方法的频繁创建,节约这部分资源。
那么一个新问题又来了:我写的这个逻辑类,究竟要不要用static?
目前没有这方面的经验和资料,我先按照play的逻辑来处理吧,毕竟这样做,节约了频繁创建类和对象的步骤,速度绝对会快。
如果哪一天真需要加锁和开线程的话,那么我可以讲函数的static去掉,对象引用一下就OK了。这篇文章我先留在这里,再过几个月,看看这样做有多少好处。
备注一下另外的资料:以下这种方式在Controller就不能用。
public class TestC extends Controller{ public static void t(){ synchronized(TestC.class){ Thread.sleep(10000); } ok(); } public static void t2(){ ok(); } }
play框架在处理所有请求时,只是用了若干个有限的线程进行线程复用,个数一般和CPU核心相等,主要是为了提高性能,比较频繁的创建和销毁线程是比较重的行为。像上面的例子在play里不能那么写,需要换个方式。play引入了await方法和Promise对象,Promise继承了java并发框架中的Future。
await(new Job<Long>(){ @Override public Long doJobWithResult() throws Exception { synchronized(TestC.class){ Thread.sleep(10000); } return null; } }.now())这样其实就开启了另外一个线程,本次请求被挂起但是线程并未阻塞,其他请求仍然可用。
相关文章推荐
- Python机器学习——如何shuffle一个数据集(ndarray类型)
- Java_Html_杂七杂八_路径中有/和无/的区别,../和./的区别
- jdk使用问题汇总
- python os模块常用命令
- Java音频播放
- 解决"应用程序无法启动,因为应用程序的并行配置不正确"的问题(VS2008 + qt)
- WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;继承于 ViewGroup.LayoutParams 。
- Call to localhost/127.0.0.1:9000 failed on connection exception:java.net.ConnectException
- C++11标准
- java 调用百度地址匹配接口获取经纬度坐标
- Codeforces 598DIgor In the Museum (BFS加离线优化)
- [python]通过微信公众号“Python程序员”,编写python代码
- java.lang.Runtime.availableProcessors() 方法
- Spring MVC入门
- thinkphp中的volist标签
- Eclipse断点调试
- c++函数模板于类中的应用
- javaSE(04)(equals方法)
- SAP 金税接口代码 供参考
- 【术】深入理解c#反射