public void add(Session session) {
sessions.put(session.getIdInternal(), session);
int size = getActiveSessions();
if( sizemaxActive ) {
synchronized(maxActiveUpdateLock) {
if( sizemaxActive ) {
maxActive = size;
}
}
}
}
public void remove(Session session, boolean update) {
if (session.getIdInternal() != null) {
sessions.remove(session.getIdInternal());
}
}
我们来看 , 由于其只保存在内存的Map中protected MapString, Session sessions = new
ConcurrentHashMap(),每个Tomcat实例都对于不同的map,多个实例间无法共享数据 。
对应到RedisSessionManager对于session的处理,都是直接操作redis,基本代码是下面这个样:
public void save(Session session) throws IOException {
Jedis jedis = null;
Boolean error = true;
try {
RedisSession redisSession = (RedisSession) session;
Boolean sessionIsDirty = redisSession.isDirty();
redisSession.resetDirtyTracking();
byte[] binaryId = redisSession.getId().getBytes();
jedis = acquireConnection();
if (sessionIsDirty || currentSessionIsPersisted.get() != true) {
jedis.set(binaryId, serializer.serializeFrom(redisSession));
}
currentSessionIsPersisted.set(true);
jedis.expire(binaryId, getMaxInactiveInterval());
} }
移除时的操作是这样的
public void remove(Session session, boolean update) {
Jedis jedis = null;
Boolean error = true;
log.trace("Removing session ID : " + session.getId());
try {
jedis = acquireConnection();
jedis.del(session.getId());
error = false;
} finally {
if (jedis != null) {
returnConnection(jedis, error);
}
}
}
而此时,多个Tomcat实例都读取相同的Redis,session数据是共享的 , 其它实例的初始请求过来时,由于会执行findSession的操作,此时会从Redis中加载session,
public Session findSession(String id) throws IOException {
RedisSession session;
if (id == null) {
session = null;
currentSessionIsPersisted.set(false);
} else if (id.equals(currentSessionId.get())) {
session = currentSession.get();
} else {
session = loadSessionFromRedis(id); // 看这里,会从redis中load
if (session != null) {
currentSessionIsPersisted.set(true);
}
}
currentSession.set(session);
currentSessionId.set(id);
return session;
}
从而可以保证在一个实例被切换后,另外的实例可以继续响应同一个session的请求 。
以上即为Redis实现session共享高可用的一些关键内容 。有兴趣的朋友可以看下通过Memcached实现高可用,也是这个原理 。顺着这个思路,如果你有将Session存储在其它地方的需求时,完全可以写一个出来,自己动手,丰衣足食 。
总结一下,我们是通过自定义的Valve来实现请求后session的拦截,同时,使用自定义的SessionManager,来满足不同的session创建与存储的需求 。而至于是存储在Redis/Memcached中,还是存储在DB中,只是位置的区别 。原理,是一致的 。
php怎么连接oracle 集群(oracle rac)?$oraUser="nihao";//数据库账号
$oraPass="123456"; //密码
$oraDB="(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=127.0.0.1)(PORT=1521)))(CONNECT_DATA=https://www.04ip.com/post/(SID=orcl)))"; //SID要和连接php集群数据库的数据库对应上
$conn = ociLOGOn($oraUser,$oraPass,$oraDB) ;//连接
$rs_search=OCIParse($conn, $sql_search);//执行SQL语句
OCIExecute($rs_search);
//$rs_search这个是结果集可以用
$row=oci_fetch_array($rs_search);//把数据拿出来 这是一条数据写法 多条循环
有不明白的HIphp集群数据库我
关于php集群数据库和php mysql集群的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。
推荐阅读
- 建筑新媒体就业前景如何,建筑公司有什么新媒体工作
- 包含postgresqlstdin的词条
- flutter位置预览,flutter获取定位
- 网上表格怎么转为pdf,怎么将表格转为pdf
- python递归函数栈 python中的递归函数
- 全网最强mysql索引,mysql索引 知乎
- 2008ntp服务器,win2008ntp服务器搭建
- chatgpt会让更多人失业的简单介绍
- c语言调用带参数的函数 c语言函数调用的参数太少