1,首先,这个sae的java主机环境免费的,这点很赞,适合技术开发者研究一些自己的程序。如果做些小型应用,使用这个环境也足矣,上面有相当成熟的配套设施,比如 memcached nosql mysql 文件存储 ,尤其是做微博应用 直接使用sae 相当不错。
2,数据库的读写分离,这点相当不错,从性能上理论上这个环境应用得当能适应100W级的访问量
原理是数据库的主从复制,主数据库(infodb)用来执行修改的数据操作,从数据库(myisam引擎)用来查询
结合spring mvc应用:
首先,配置了2个session, 只读的session是不用事务控制的,写入的数据库是需要加事务的(这种场景特别适合互联网应用)
spring.xml:
<context:annotation-config></context:annotation-config>
<context:component-scan base-package="com.xiawucha"/>
<bean id="sqlSessionFactoryWrite" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="wDataSource" />
<property name="configLocation" value="classpath:mybatis_write.xml"/>
</bean>
<bean id="sqlSessionWrite" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactoryWrite" />
</bean>
<bean id="sqlSessionFactoryRead" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="rDataSource" />
<property name="configLocation" value="classpath:mybatis_read.xml"/>
</bean>
<bean id="sqlSessionRead" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactoryRead" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="wDataSource" />
</bean>
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" id="wDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3306/app_nicexiawucha?useUnicode=true&characterEncoding=utf8" />
<property name="user" value="root" />
<property name="password" value="123456" />
<property name="acquireIncrement" value="3"></property>
<property name="initialPoolSize" value="2"></property>
<property name="maxIdleTime" value="15"></property>
<property name="maxPoolSize" value="40"></property>
<property name="minPoolSize" value="3"></property>
<property name="acquireRetryDelay" value="1000"></property>
<property name="acquireRetryAttempts" value="3"></property>
<property name="breakAfterAcquireFailure" value="false"></property>
</bean>
<bean class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" id="rDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver" />
<property name="jdbcUrl" value="jdbc:mysql://127.0.0.1:3307/app_nicexiawucha?useUnicode=true&characterEncoding=utf8" />
<property name="user" value="root" />
<property name="password" value="123456" />
<property name="acquireIncrement" value="3"></property>
<property name="initialPoolSize" value="2"></property>
<property name="maxIdleTime" value="15"></property>
<property name="maxPoolSize" value="40"></property>
<property name="minPoolSize" value="3"></property>
<property name="acquireRetryDelay" value="1000"></property>
<property name="acquireRetryAttempts" value="3"></property>
<property name="breakAfterAcquireFailure" value="false"></property>
</bean>
dao:
public class BaseDao {
//只写的会话
@Resource(name="sqlSessionWrite")
public SqlSessionTemplate writeTemplate;
//只读的会话
@Resource(name="sqlSessionRead")
public SqlSessionTemplate readTemplate;
}
例子:
public NeizhaoUserCom findCompanyByUId(String uid) { //查询动作,使用
// TODO Auto-generated method stub
return this.readTemplate.selectOne("NeizhaoUser.findCompanyById", uid);
}
public void createCompany(NeizhaoUserCom company) { // 更新动作,使用写入的会话
this.writeTemplate.insert("NeizhaoUser.saveCompany", company);
}
3,然后重点是不足之处:
1)环境还不是很稳定, 耗cpu资源高,没什么功能也可能导致资源过高而超出限额
2)svn可上传的文件大小有限制(好像50m最大),只能整个war上传部署;大型应用,光jar包就不只50M了。 如果能改成类似mvn的依赖包形式部署就好了,jar包压根就不用再打包到war里面, 自己代码能上10个m已经是很大的量了。也许哪一天sae会优化。