1)同步数据首先要得到数据,如何得到数据呢?
第一步:创建签卡数据的触发器
第二步:创建同步日志类,把所有的签卡信息都添加到同步日志里
2)从数据源得到数据后以Json格式传递
3)创建一个SpringMVC的Maven工程,
a、以阿里巴巴的Druid配置数据源,
b、创建个定时器,每隔一分钟从Salesforce的日志里读取信息
c、在Dao层里写数据同步的代码
d、测试
trigger attendanceSyncTrigger on attendance__c (after insert) {
//查询类型
List rtList = [SELECT Id, Name, DeveloperName, SobjectType FROM RecordType WHERE SobjectType='attendance__c'];
Map<String,String> recordMap = new Map<String,String>();
for(RecordType r:rtList){
recordMap.put(r.Name,r.Id);
}
attendance__c order = Trigger.new[0];
//如果是插入状态,判断是不是“考勤“
if(Trigger.isInsert && recordMap.get('考勤管理').equals(order.RecordTypeId)){
if(order != null){
String projson = json.serialize(order);
system.debug('jjjjjjj:'+projson);
//创建日志
SynLog__c syn = new SynLog__c();
syn.Name=String.valueOf(order.Id).subString(0,15);
//把数据赋给日志参数
syn.parameter__c = projson;
syn.ObjectName__c = 'attendance__c';
syn.Operation__c = 'Insert';
syn.Flag__c ='No';
insert syn;
}
}
}
2)pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>groupIdgroupId>
<artifactId>dzjgartifactId>
<version>1.0-SNAPSHOTversion>
<packaging>warpackaging>
<properties>
<spring.version>4.0.5.RELEASEspring.version>
<slf4j.version>1.7.5slf4j.version>
<logback.version>1.0.13logback.version>
<fastjson.version>1.1.34fastjson.version>
<cio.version>2.2cio.version>
<clang.version>3.1clang.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webmvcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-beansartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-aopartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-txartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-jdbcartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-context-supportartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-expressionartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>org.quartz-schedulergroupId>
<artifactId>quartzartifactId>
<version>2.1.7version>
dependency>
<dependency>
<groupId>org.apache.openejbgroupId>
<artifactId>javaee-apiartifactId>
<version>5.0-3version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>javax.servlet.jspgroupId>
<artifactId>jsp-apiartifactId>
<version>2.2version>
<scope>providedscope>
dependency>
<dependency>
<groupId>taglibsgroupId>
<artifactId>standardartifactId>
<version>1.1.2version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>druidartifactId>
<version>0.2.25version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.38version>
dependency>
<dependency>
<groupId>jstlgroupId>
<artifactId>jstlartifactId>
<version>1.2version>
dependency>
<dependency>
<groupId>com.alibabagroupId>
<artifactId>fastjsonartifactId>
<version>${fastjson.version}version>
dependency>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.2.4version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
<version>${slf4j.version}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>log4j-over-slf4jartifactId>
<version>${slf4j.version}version>
dependency>
<dependency>
<groupId>org.slf4jgroupId>
<artifactId>jcl-over-slf4jartifactId>
<version>${slf4j.version}version>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-classicartifactId>
<version>${logback.version}version>
<exclusions>
<exclusion>
<groupId>org.slf4jgroupId>
<artifactId>slf4j-apiartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.apache.commonsgroupId>
<artifactId>commons-lang3artifactId>
<version>${clang.version}version>
dependency>
<dependency>
<groupId>commons-langgroupId>
<artifactId>commons-langartifactId>
<version>2.6version>
dependency>
<dependency>
<groupId>commons-iogroupId>
<artifactId>commons-ioartifactId>
<version>${cio.version}version>
dependency>
<dependency>
<groupId>antgroupId>
<artifactId>antartifactId>
<version>1.6.5version>
dependency>
<dependency>
<groupId>commons-beanutilsgroupId>
<artifactId>commons-beanutilsartifactId>
<version>1.8.3version>
<exclusions>
<exclusion>
<groupId>commons-logginggroupId>
<artifactId>commons-loggingartifactId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>commons-fileuploadgroupId>
<artifactId>commons-fileuploadartifactId>
<version>1.2.2version>
dependency>
<dependency>
<groupId>commons-discoverygroupId>
<artifactId>commons-discoveryartifactId>
<version>0.2version>
dependency>
<dependency>
<groupId>net.sf.jxlsgroupId>
<artifactId>jxls-coreartifactId>
<version>1.0version>
<exclusions>
<exclusion>
<artifactId>commons-beanutilsartifactId>
<groupId>commons-beanutilsgroupId>
exclusion>
<exclusion>
<artifactId>commons-loggingartifactId>
<groupId>commons-logginggroupId>
exclusion>
<exclusion>
<artifactId>poi-ooxml-schemasartifactId>
<groupId>org.apache.poigroupId>
exclusion>
<exclusion>
<artifactId>poiartifactId>
<groupId>org.apache.poigroupId>
exclusion>
<exclusion>
<artifactId>poi-ooxmlartifactId>
<groupId>org.apache.poigroupId>
exclusion>
<exclusion>
<artifactId>commons-digesterartifactId>
<groupId>commons-digestergroupId>
exclusion>
exclusions>
dependency>
<dependency>
<groupId>org.apache.httpcomponentsgroupId>
<artifactId>httpclientartifactId>
<version>4.3-beta2version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.9version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-testartifactId>
<version>${spring.version}version>
dependency>
<dependency>
<groupId>entgroupId>
<artifactId>entartifactId>
<version>1.0.0version>
<scope>systemscope>
<systemPath>${project.basedir}/WebRoot/WEB-INF/lib/enterprise.jarsystemPath>
dependency>
<dependency>
<groupId>wscgroupId>
<artifactId>wscartifactId>
<version>1.0.0version>
<scope>systemscope>
<systemPath>${project.basedir}/WebRoot/WEB-INF/lib/force-wsc-34.2.1-uber.jarsystemPath>
dependency>
<dependency>
<groupId>sqlgroupId>
<artifactId>sqlartifactId>
<version>1.0.0version>
<scope>systemscope>
<systemPath>${project.basedir}/WebRoot/WEB-INF/lib/sqljdbc4-3.0.jarsystemPath>
dependency>
dependencies>
<build>
<outputDirectory>${basedir}/WebRoot/WEB-INF/classesoutputDirectory>
<plugins>
<plugin>
<artifactId>maven-war-pluginartifactId>
<configuration>
<webappDirectory>${basedir}/WebRootwebappDirectory>
<warSourceDirectory>${basedir}/WebRootwarSourceDirectory>
configuration>
plugin>
<plugin>
<artifactId>maven-compiler-pluginartifactId>
<configuration>
<source>1.6source>
<target>1.6target>
<encoding>UTF-8encoding>
configuration>
plugin>
<plugin>
<groupId>org.mortbay.jettygroupId>
<artifactId>maven-jetty-pluginartifactId>
<version>6.1.26version>
<configuration>
<webAppSourceDirectory>${basedir}/src/main/webappwebAppSourceDirectory>
configuration>
plugin>
plugins>
build>
project>
3)定时器配置文件:app-scheduling.xml
<beans default-lazy-init="true">
<bean id="SfToZKScheduler" class="com.dzjg.TimedTask.SfToZKScheduler" />
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
<property name="triggers">
<list>
<ref local="SfToZKSchedulerTrigger" />
list>
property>
bean>
<bean id="SfToZKSchedulerTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="cronExpression" value="0 0/1 * * * ?" />
<property name="jobDetail" ref="SfToZKSchedulerData" />
bean>
<bean id="SfToZKSchedulerData"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="SfToZKScheduler" />
<property name="targetMethod" value="sync" />
<property name="concurrent" value="false" />
bean>
beans>
4)数据层配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:config.propertiesvalue>
list>
property>
bean>
<bean id="logDataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true">
<property name="driverClassName" value="${jdbc.log.driverClassName}"/>
<property name="url" value="${jdbc.log.url}"/>
<property name="username" value="${jdbc.log.username}"/>
<property name="password" value="${jdbc.log.password}"/>
<property name="dbType" value="mysql"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="1800" />
<property name="maxActive" value="20"/>
<property name="initialSize" value="5"/>
<property name="maxWait" value="2000"/>
<property name="minIdle" value="5"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="filters" value="stat"/>
bean>
<bean id="dataSourceZK" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close" lazy-init="true">
<property name="driverClassName" value="${jdbc.zk.driverClassName}"/>
<property name="url" value="${jdbc.zk.url}"/>
<property name="username" value="${jdbc.zk.username}"/>
<property name="password" value="${jdbc.zk.password}"/>
<property name="dbType" value="sqlServer"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="1800" />
<property name="maxActive" value="20"/>
<property name="initialSize" value="5"/>
<property name="maxWait" value="2000"/>
<property name="minIdle" value="5"/>
<property name="timeBetweenEvictionRunsMillis" value="60000"/>
<property name="minEvictableIdleTimeMillis" value="300000"/>
<property name="testWhileIdle" value="true"/>
<property name="testOnBorrow" value="false"/>
<property name="testOnReturn" value="false"/>
<property name="poolPreparedStatements" value="true"/>
<property name="maxPoolPreparedStatementPerConnectionSize" value="20"/>
<property name="validationQuery" value="SELECT 'x'"/>
<property name="filters" value="stat"/>
bean>
<bean id="zkJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSourceZK"/>
bean>
<bean id="txZK" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSourceZK"/>
bean>
<bean id="logJdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="logDataSource"/>
bean>
<bean id="logTx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="logDataSource"/>
bean>
<context:component-scan base-package="com.dzjg.dao"/>
beans>
5)动作配置app-action.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<mvc:annotation-driven/>
<context:component-scan base-package="com.dzjg.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
bean>
<mvc:resources mapping="/static/**" location="/static/"/>
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<property name="maxUploadSize" value="200000000000"/>
bean>
<bean id="exceptionResolver"
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.springframework.web.multipart.MaxUploadSizeExceededException">/web/error_upload
prop>
props>
property>
bean>
beans>
6)实体类配置
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<bean id="appUtil" class="com.dzjg.common.AppUtil"/>
<context:component-scan base-package="com.dzjg.TimedTask"/>
beans>
7)从Salesforce读取信息
public class SyncLogDao {
/**
* 查询salesforce同步日志
*
* @return
*/
public static List getSynLogList() {
String soql = "select parameter__c,errorMsg__c,Flag__c,ObjectName__c,Operation__c,id from SynLog__c where Flag__c = 'No'";
try {
return (List) SFDaoUtils.queryListBySql(soql);
} catch (ConnectionException e) {
throw new RuntimeException(e);
}
}
/**
* 回写成功日志
*
* @param id
*/
public static void markFinishedById(String id) {
try {
SynLog__c synLog = new SynLog__c();
synLog.setId(id);
//设置处理时间
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
synLog.setCompleteDate__c(cal);
synLog.setFlag__c("Yes");
SFDaoUtils.updateSObject(synLog);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 回写失败信息
* @param id
* @param errorMsg
*/
public static void markErrorMsgById(String id, String errorMsg) {
try {
SynLog__c a = new SynLog__c();
a.setId(id);
a.setErrorMsg__c(errorMsg);
//设置处理时间
Date date = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(date);
a.setCompleteDate__c(cal);
a.setFlag__c("Error");
SFDaoUtils.updateSObject(a);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
8)把数据写入到数据库
/**
* salesforce 同步到中控考勤系统
*
* @Project dzjg
* @Package com.dzjg.TimedTask
* @author chenlin
* @version 1.0
* @Date 2016年5月16日
*/
@Service
public class SfToZKScheduler {
/**
* 记录日志文件
*/
private Logger log = LoggerFactory.getLogger(SfToZKScheduler.class);
/**
* 在app-scheduling.xml里 调用,进行定时扫描
*/
public void sync() {
List synLogList = SyncLogDao.getSynLogList();
for (SynLog__c synLog : synLogList) {
handleItem(synLog);
}
}
public void handleItem(final SynLog__c synLog) {
try {
if(synLog == null){
return;
}
if (LogDao.isExit(synLog.getId())) {
SyncLogDao.markFinishedById(synLog.getId());// 回写成功日志
return;
}
if ("attendance__c".equalsIgnoreCase(synLog.getObjectName__c())) {
log.info("同步用户名称,id,签卡时间,签卡类型到中控考勤系统:" + synLog.getParameter__c());
final Attendance__c order = JSON.parseObject(synLog.getParameter__c(), Attendance__c.class);
ERPDao.commit(new VoidWrapper() {
public void doWork() {
if (order != null) {
try {
System.out.println("order == "+ order);
ERPDao.saveAttendenc(order);
log.info("考勤数据到中控:SUCCESS!!!");
} catch (Exception e) {
e.printStackTrace();
log.info("考勤数据到中控:ERROR!!!");
}
}
SyncLogDao.markFinishedById(synLog.getId());// 回写成功日志
LogDao.insertLog(synLog);
}
});
}
} catch (Exception e) {
log.error(ExceptionUtils.getStackTrace(e));
SyncLogDao.markErrorMsgById(synLog.getId(), e.getMessage());// 回写错误日志
}
}
}
9)数据层处理
public static void saveAttendenc(final Attendance__c order) {
if (order == null) {
return;
}
String uid = order.getAttend_userid__c();
if (TextUtil.isEmpty(uid)) {
return;
}
String userSql = "select userid from userinfo where badgenumber = ? ";
List list = zkJdbcTemplate.queryForList(userSql, new Object[] { uid.trim() }, String.class);
if (list == null || list.size() <= 0) {
return;
}
final String userid = list.get(0).toString();
if (!TextUtil.isEmpty(userid) && TextUtil.isNum(userid)) {
String sql = "insert into checkexact "
+ " (change_time, create_operator, create_time, UserID, CHECKTIME, YUYIN , audit_status, CHECKTYPE, status, ISMODIFY, ISDELETE, INCOUNT, ISCOUNT) "
+ " values (?, ?, ?, ?, ?, ?, 2, 'l', 0, 0, 0, 0, 0)";
zkJdbcTemplate.update(sql, new PreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps) throws SQLException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
ps.setString(1, sdf.format(new Date()));
ps.setString(2, order.getAttend_name__c());
ps.setString(3, sdf.format(new Date()));
ps.setInt(4, Integer.parseInt(userid));
// 添加异常打卡时间
ps.setString(5, order.getAttend_time__c());
ps.setString(6, order.getAttend_type__c());
}
});
}
}
10)获取Spring 的jdbcTemplate工具类
public class AppUtil implements ApplicationContextAware {
private static ApplicationContext appCtx;
/**
* 此方法可以把ApplicationContext对象inject到当前类中作为一个静态成员变量。
*
* @param applicationContext ApplicationContext 对象
* @throws org.springframework.beans.BeansException
*/
public void setApplicationContext(ApplicationContext applicationContext)
throws BeansException {
appCtx = applicationContext;
}
/**
* 这是一个便利的方法,帮助我们快速得到一个BEAN
*
* @param beanName bean的名字
* @return 返回一个bean对象
*/
public static T getBean(String beanName) {
checkApplicationContext(appCtx);
return (T) appCtx.getBean(beanName);
}
/**
* 用于方便单元测试
* @param applicationContext
*/
private static void checkApplicationContext(ApplicationContext applicationContext) {
if (appCtx == null) {
synchronized (AppUtil.class) {
if (applicationContext == null) {
appCtx = new ClassPathXmlApplicationContext("spring/app-context.xml","spring/app-dao.xml","spring/app-action.xml");
}
}
}
}
}
—————————————————————————————————————————————————–
下载地址:
https://item.taobao.com/item.htm?id=555888526201
01.高级架构师四十二个阶段高
02.Java高级系统培训架构课程148课时
03.Java高级互联网架构师课程
04.Java互联网架构Netty、Nio、Mina等-视频教程
05.Java高级架构设计2016整理-视频教程
06.架构师基础、高级片
07.Java架构师必修linux运维系列课程
08.Java高级系统培训架构课程116课时
+
hadoop系列教程,java设计模式与数据结构, Spring Cloud微服务, SpringBoot入门
【入门篇】
J2SE的Socket网络编程应用
J2SE的反射机制高级应用
J2SE高深讲解
JAVA编程思想 中级教程
JAVA编程思想 初级教程
JAVA编程思想 高级教程
基于J2SE的QQ聊天工具开发
我来说说面向对象
【进阶篇】
CRM项目
Eclipse
Hibernate
JAVA WEB开发视频
JAVAWEB开发实战经典-高级案例篇
JAVAWEB
JAVA线程并发教程
java网上在线支付实战视频
java设计模式
jdbc
junit
mybatis
spring mvc
SpringMvc+Spring+MyBatis+Maven整合视频
SpringMVC
Spring
Struts2 开发实战讲解
Struts2+Spring3+Hibernate4+Maven+EasyUI整合入门视频
Struts
SVN
tomcat
weblogic
WebService从入门到上手企业开发
企业系统OA办公自动化
手机进销存系统
数据结构和算法视频
设计模式系列
【高级篇】
Cas单点登录
Extjs4.1+Spring3.2+hibernate4.1+MySql5商城
Git权威指南
groovy入门视频
Java 8新特性
Lucene
Mongodb
node.js
Nutch相关框架
OA办公自动化系统
Quartz Job定时任务
Solr高级应用视频
Spring Security权限控制
Spring源码解读与设计详析
Struts2源码剖析与架构指导
大型CMS内容管理系统项目
微信入门视频
深入JVM内核—原理、诊断与优化
深入浅出微信公众平台实战开发(微网站、LBS云、Api接口调用、服务号高级接口)
银行接口资料
【架构篇】
ActiveMQ实战
Apache-Tomcat集群搭建
Linux集群
Linux高级架构架构方案及实现指南
Memcached分布式集群
Mysql特级优化课程
Nginx+Tomcat+Memcached群集配置软件包
Nginx服务器搭建
Nginx网站架构实战(Web服务器负载均衡与反向代理)
SOA Dubbo
storm入门到精通
storm集群的搭建
storm项目实战
UML建模
互联网公司技术架构系列
京东B2C平台推荐搜索的实践和思考
京东大数据分析与创新应用
京东大规模存储持续研发
京东电商海量订单处理OFC系统的关键技术
优米网架构设计方案
基于SOA 思想下的百万数据架构
大型网站提速之MySQL优化
大型网站架构设计
大数据高并发架构实战案例
数据优化技术Redis
数据库高并发原理
深入Java程序性能调优
深入浅出MongoDB应用实战集群及系统架构
深度揭秘服务器端内幕
电商网站之Solr应用
系统架构设计师
阿里分布式数据库服务实践
—————————————————————————————————————————————————–