java client session并发

提问参考模版:

  • nebula 版本:v2.0.1
  • 部署方式(分布式 / 单机 / Docker / DBaaS):单机
  • 是否为线上版本:N
    -java client依赖

    com.vesoft
    client
    2.0.0-SNAPSHOT
  • 问题的具体描述
    1.使用java client连接数据库,因为只有一个图空间,所有没有使用创建pool-获取seesion-释放session-关闭pool方式频繁建立连接,而是使用单例模式创建连接池,只初始化一次,不关闭连接,session只获取一次,如程序不主动调用释放方法,则一直使用该session对象。
    问题1.如程序不调用pool的close方法,会不会造成内存泄漏?连接池会不会出现失效或关闭的情况,如何判断连接是否失效或关闭?
    问题2.seesion只创建一个,如果多个线程同时使用该session执行语句会出现什么问题?如果多线程并发下,但又不想每执行一个语句就getSession()且use xxx一次,该如何维护?
    问题3.session如果不主动释放,idletime=0时但服务挂了或idletime=180时超过配置时间,session失效,有没有判断sessiond对象是否正常的方法?

问题1.如程序不调用pool的close方法,会不会造成内存泄漏?连接池会不会出现失效或关闭的情况,如何判断连接是否失效或关闭?

假如你程序退出,你不进行pool的close,也不进行session的release,那么导致的问题是,连接没有主动被断开,服务持有客户端的连接,造成资源浪费,还有占用服务端存储session信息。还有这个跟内存泄漏有什么关系,你是用的时候出现内存泄漏了还是怎么,为啥会觉得会导致内存泄漏。

连接池会不会出现失效或关闭的情况,如何判断连接是否失效或关闭?

只要你拿了session,这个连接就永远不会失效,连接池会保证你的session的连接是可靠的,除非服务端全部不可用,那么连接也就断开,也就没有可用连接。不需要用户去判断,用户只需要捕获异常处理就好,异常就是当所有连接都不可用,也就是服务端异常或者网络异常导致的。

问题2.seesion只创建一个,如果多个线程同时使用该session执行语句会出现什么问题?如果多线程并发下,但又不想每执行一个语句就getSession()且use xxx一次,该如何维护?

session不支持多线程操作,多线程使用会抛异常告诉你不允许这样使用。如果你们业务场景只有一个space,那么你们自己维护一个session的列表就好,至于session的可靠性,由连接池自己去保证,你理解你们拿到的session都是可用的就好。

问题3.session如果不主动释放,idletime=0时但服务挂了或idletime=180时超过配置时间,session失效,有没有判断sessiond对象是否正常的方法?

你这里的idletime是服务端的配置吧。假如是的话,session 不主动释放,然后又长时间不操作数据库,那么这个session在服务端就会因为idletime超过设置的被删除,那么用户再用这个session去操作的话,服务端会回复不合法的session或者过期session,这样用户拿到这个错误码,就可以做处理,比如重新拿个session。

2 个赞

该话题在最后一个回复创建后30天后自动关闭。不再允许新的回复。