j2cache 一级缓存用的是ehcache2,redis用的是2.8,Too many open files问题

发布于 2021-12-07 04:22:11 字数 4891 浏览 813 评论 25

异常信息:

Caused by: com.thinking.exception.LoadingCacheException: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
	at com.thinking.cache.j2cache.J2CacheKit.get(J2CacheKit.java:55)
	at com.thinking.plugin.cookiesession.CookieSessionKit.getAttr(CookieSessionKit.java:165)
	... 56 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
	at redis.clients.util.Pool.getResource(Pool.java:50)
	at redis.clients.jedis.JedisPool.getResource(JedisPool.java:99)
	at net.oschina.j2cache.redis.RedisClient.get(RedisClient.java:170)
	at net.oschina.j2cache.redis.RedisGenericCache.getBytes(RedisGenericCache.java:61)
	at net.oschina.j2cache.redis.RedisCache.getObject(RedisCache.java:64)
	at net.oschina.j2cache.CacheProviderHolder.getObject(CacheProviderHolder.java:138)
	at net.oschina.j2cache.CacheChannel.getObject(CacheChannel.java:134)
	at com.thinking.cache.j2cache.J2CacheKit.get(J2CacheKit.java:50)
	... 57 more
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.SocketException: Too many open files
	at redis.clients.jedis.Connection.connect(Connection.java:164)
	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:80)
	at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1676)
	at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:87)
	at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:868)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:435)
	at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363)
	at redis.clients.util.Pool.getResource(Pool.java:48)
	... 64 more
Caused by: java.net.SocketException: Too many open files
	at java.net.Socket.createImpl(Socket.java:460)
	at java.net.Socket.getImpl(Socket.java:520)
	at java.net.Socket.setReuseAddress(Socket.java:1442)
	at redis.clients.jedis.Connection.connect(Connection.java:148)
	... 71 more

升级了j2cache后,系统在正式环境运行半小时左右出现这异常。后换回旧版本,一切恢复正常。

配置文件:

#J2Cache configuration


#########################################
# Cache Broadcast Method
# values:
# jgroups -> use jgroups's multicast
# redis -> use redis publish/subscribe mechanism
#########################################

j2cache.broadcast=redis

#组播的通道名称
jgroups.channel.name=j2cache

#########################################
# Level 1&2 provider
# values:
# none -> disable this level cache
# ehcache -> use ehcache2 as level 1 cache
# ehcache3 -> use ehcache3 as level 1 cache
# caffeine -> use caffeine as level 1 cache(only in memory)
# redis -> use redis(hashs) as level 2 cache
# [classname] -> use custom provider
#########################################

j2cache.L1.provider_class=ehcache
j2cache.L2.provider_class=redis

#########################################
# Cache Serialization Provider
# values:
# fst -> fast-serialization
# kyro -> kyro
# java -> java standard
# [classname implements Serializer]
#########################################

j2cache.serialization=fst

#########################################
# Ehcache configuration
#########################################

ehcache.configXml=/ehcache.xml

#ehcache3.configXml=/ehcache3.xml
#ehcache3.defaultHeapSize=1000

#########################################
# Caffeine configuration
# caffeine.region.[name]=size, xxxx[s|m|h|d]
#
#########################################

#caffeine.region.default=1000, 1h

#########################################
# Redis connection configuration
#########################################

#########################################
# Redis Cluster Mode
#
# single -> single redis server
# sentinel -> master-slaves servers
# cluster -> cluster servers (数据库配置无效,使用 database=0)
# sharded -> sharded servers  (密码、数据库必须在 hosts 中指定,且连接池配置无效 ; redis://user:password@127.0.0.1:6379/0)
#
#########################################

redis.mode=single

#redis storage mode (generic|hash)
redis.storage=generic

#cluster name just for sharded
#redis.cluster_name=j2cache

## redis cache namespace optional, default[j2cache]
redis.namespace=j2cache

## connection
redis.hosts=10.10.10.251:6379
redis.timeout=2000
#redis.password =
redis.database=1

## redis pub/sub channel name
redis.channel=j2cache

## redis pool properties
redis.maxTotal=-1
redis.maxIdle=2000
redis.maxWaitMillis=10000
redis.minEvictableIdleTimeMillis=864000000
redis.minIdle=1000
redis.numTestsPerEvictionRun=10
redis.lifo=false
redis.softMinEvictableIdleTimeMillis=10
redis.testOnBorrow=true
redis.testOnReturn=false
redis.testWhileIdle=false
redis.timeBetweenEvictionRunsMillis=300000
redis.blockWhenExhausted=true

请教各位,请问是什么原因引起呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(25

苍暮颜 2021-12-09 14:36:16

jfinal 可能接不上了,jfinal 里是<T> T  get()来获取缓存的。@JFinal @红薯

猫烠⑼条掵仅有一顆心 2021-12-09 14:36:15

好的,这个改动好大。

蓝颜夕 2021-12-09 14:36:14

应该没其它BUG了吧!要不要等一头半个月再在正式环境运行呢?

眼眸 2021-12-09 14:36:13

还是有BUG,存进去的是Long,重启项目运行,取出来的是string。

私藏温柔 2021-12-09 14:36:13

@mr.ct 你放进去long,应该getlong来获取,否则redis把这一切都当成字符串

明月松间行 2021-12-09 14:36:13

回复
@Mr.CT : 没办法啊, redis 就这个路子

卸妝后依然美 2021-12-09 14:36:12

maven仓库中没有找到 http://mvnrepository.com/artifact/net.oschina.j2cache/j2cache-core

风透绣罗衣 2021-12-09 14:36:10

回复
@江南红衣 : 的确,但是在 sonatype 已经发布成功,奇怪

醉生梦死 2021-12-09 14:36:09

@红薯 回复
@红薯 : 多谢大佬。

苍暮颜 2021-12-09 14:36:09

回复
@江南红衣 : 重新发布了

离不开的别离 2021-12-09 14:36:08

已经提交 2.2.3 版本到 maven 仓库了,应该一会就可以用了。。。。

明月松间行 2021-12-09 14:36:07
return (Serializable)(bytes != null && bytes.length != 0?(bytes[0] != 0?new String(Arrays.copyOfRange(bytes, 1, bytes.length)):g_serializer.deserialize(Arrays.copyOfRange(bytes, 1, bytes.length))):null);

应该是这样吧:

new String(Arrays.copyOfRange(bytes, 0, bytes.length))

@红薯

狠疯拽 2021-12-09 14:36:05

引用来自“Mr.CT”的评论

第一次执行:

CacheChannel channel = J2Cache.getChannel();
channel.set("SqlSearchCacheTime","5dfc98a8cdf4234c",5L);
CacheObject obj = channel.get("SqlSearchCacheTime","5dfc98a8cdf4234c");
System.out.println(obj.getValue());

程序结束后执行:

CacheChannel channel = J2Cache.getChannel();
//channel.set("SqlSearchCacheTime","5dfc98a8cdf4234c",5L);
CacheObject obj = channel.get("SqlSearchCacheTime","5dfc98a8cdf4234c");
System.out.println(obj.getValue());

第一次执行返回5,第二次执行返回空字符串!@红薯

叹沉浮 2021-12-09 14:35:45

你放 long 数据到缓存,应该用 getLong 来读取哦

卸妝后依然美 2021-12-09 14:34:49

不过的确有问题,擦,这个着急没好好测试

明媚如初 2021-12-09 14:31:17

第一次执行:

CacheChannel channel = J2Cache.getChannel();
channel.set("SqlSearchCacheTime","5dfc98a8cdf4234c",5L);
CacheObject obj = channel.get("SqlSearchCacheTime","5dfc98a8cdf4234c");
System.out.println(obj.getValue());

程序结束后执行:

CacheChannel channel = J2Cache.getChannel();
//channel.set("SqlSearchCacheTime","5dfc98a8cdf4234c",5L);
CacheObject obj = channel.get("SqlSearchCacheTime","5dfc98a8cdf4234c");
System.out.println(obj.getValue());

第一次执行返回5,第二次执行返回空字符串!@红薯

琴流音 2021-12-09 14:23:58

这个我测试没问题哦,你看看

累赘 2021-12-09 14:20:47

@红薯 又发现个BUG,BUG可以重现,启动后,我put进一个Long型数据,然后重启获取出来的是空字符串!

温柔少女心 2021-12-09 14:13:36

现在可以了。

眼泪淡了忧伤 2021-12-09 13:48:16

@Mr.CT 应该在 publish 里有问题,发布消息没有关闭 jedis 连接,我试试看

巡山小妖精 2021-12-09 13:48:15

最新beta版

私藏温柔 2021-12-09 08:51:53

2.2.0beta

毁梦 2021-12-09 08:35:56

回复
@Mr.CT : 升级到最新的版本跑跑看,我这边没碰到这样的问题

岁月打碎记忆 2021-12-09 06:46:29

回复
@Mr.CT : 一般系统默认的 max open files 是 1024 ,你需要提升一下这个值

平生欢 2021-12-09 04:54:28

你用的什么版本?? 请提供一下具体版本号,建议更新到最新的 2.2.1 ,今天刚发布的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文