0 0

RMI客户端与服务端交互问题20

最近用rmi做一个聊天的小程序。在客户端和服务端交互过程中。偶尔会出现连接失败的问题:

具体错误信息如下:

服务端:

 

[framework] 2012-09-03 16:34:13,102 - org.hibernate.util.JDBCExceptionReporter -749084 [RMI TCP Connection(54)-192.168.100.1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
 [framework] 2012-09-03 16:34:13,102 - org.hibernate.util.JDBCExceptionReporter -749084 [RMI TCP Connection(54)-192.168.100.1] ERROR org.hibernate.util.JDBCExceptionReporter  - An attempt by a client to checkout a Connection has timed out.
 [framework] 2012-09-03 16:34:13,102 - org.hibernate.util.JDBCExceptionReporter -749084 [RMI TCP Connection(54)-192.168.100.1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
 [framework] 2012-09-03 16:34:13,102 - org.hibernate.util.JDBCExceptionReporter -749084 [RMI TCP Connection(54)-192.168.100.1] ERROR org.hibernate.util.JDBCExceptionReporter  - An attempt by a client to checkout a Connection has timed out.
 [framework] 2012-09-03 16:34:23,108 - org.hibernate.util.JDBCExceptionReporter -759090 [RMI TCP Connection(54)-192.168.100.1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
 [framework] 2012-09-03 16:34:23,108 - org.hibernate.util.JDBCExceptionReporter -759090 [RMI TCP Connection(54)-192.168.100.1] ERROR org.hibernate.util.JDBCExceptionReporter  - An attempt by a client to checkout a Connection has timed out.
 [framework] 2012-09-03 16:34:23,108 - org.hibernate.util.JDBCExceptionReporter -759090 [RMI TCP Connection(54)-192.168.100.1] WARN  org.hibernate.util.JDBCExceptionReporter  - SQL Error: 0, SQLState: null
 [framework] 2012-09-03 16:34:23,108 - org.hibernate.util.JDBCExceptionReporter -759090 [RMI TCP Connection(54)-192.168.100.1] ERROR org.hibernate.util.JDBCExceptionReporter  - An attempt by a client to checkout a Connection has timed out.



客户端:

java.rmi.UnmarshalException: Error unmarshaling return; nested exception is:
    java.lang.ClassNotFoundException: org.hibernate.exception.GenericJDBCException (no security manager: RMI class loader disabled)
    at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source)
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at $Proxy1.searchUser(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.remoting.rmi.RmiClientInterceptorUtils.invokeRemoteMethod(RmiClientInterceptorUtils.java:108)
    at org.springframework.remoting.rmi.RmiClientInterceptor.doInvoke(RmiClientInterceptor.java:362)
    at org.springframework.remoting.rmi.RmiClientInterceptor.invoke(RmiClientInterceptor.java:258)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)
    at $Proxy0.searchUser(Unknown Source)
    at com.qq.client.ChatWindow.crateChatContent(ChatWindow.java:221)
    at com.qq.client.ChatWindow.refChat(ChatWindow.java:251)
    at com.qq.client.ChatWindow$2.actionPerformed(ChatWindow.java:174)
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    at java.awt.Component.processMouseEvent(Unknown Source)
    at javax.swing.JComponent.processMouseEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Window.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: org.hibernate.exception.GenericJDBCException (no security manager: RMI class loader disabled)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source)
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source)
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)


初步一看以为是c3p0连接池,连接超时了。
然后改了超时等等配置。结果还是会出现这种错误。并且数据库已经查询出来值了。
连接池配置:
# Database URL
jdbc.url=jdbc:oracle:thin:@192.168.100.2:1521:orcl
# Database ClassDriver
jdbc.driver=oracle.jdbc.driver.OracleDriver
# Database login information
jdbc.username=qq
jdbc.password=8hZktr+qiZ8=
# Time to wait for an open connection before timing out
# (in milliseconds)
cpool.checkoutTimeout=10000
# Connection pool size
cpool.minPoolSize=5
cpool.maxPoolSize=40
# How long to keep unused connections around(in seconds)
# Note: MySQL times out idle connections after 8 hours(28,800 seconds)
# so ensure this value is below MySQL idle timeout
cpool.maxIdleTime=25200
# How long to hang on to excess unused connections after traffic spike
# (in seconds)
cpool.maxIdleTimeExcessConnections=0
# Acquiring new connections is slow, so eagerly retrieve extra connections
# when current pool size is reached
cpool.acquireIncrement=5
#60s check pool can get connection num
cpool.idleConnectionTestPeriod=60
#max statment
cpool.maxStatements=10

客户端RMI配置:
  <bean id="serviceClient" 
            class="org.springframework.remoting.rmi.RmiProxyFactoryBean"> 
            <property name="serviceInterface"> 
               <value>com.qq.db.DBUser</value> 
           </property> 
           <!-- serviceUrl以rmi开头,定义服务器地址与端口和服务名 --> 
           <property name="serviceUrl" value="rmi://${servers.server}:${servers.port}/${server.serverName}" /> 
           <property name="lookupStubOnStartup">
             <value>false</value>
          </property>
           <property name="refreshStubOnConnectFailure">
                <value>true</value>
          </property>
       </bean>

服务端RMI spring配置:

<!-- RMI SERVERS -->
      <bean id="registry" class="org.springframework.remoting.rmi.RmiRegistryFactoryBean">
       <property name="port" value="${port}"/>
    </bean>
    <bean id = "serviceExporter" class = "org.springframework.remoting.rmi.RmiServiceExporter" >
        <property name="registryHost"  value="${servers}" />
        <property name = "serviceName" value = "${serviceName}" />
        <property name = "service" ref = "DBUserImpl" />
        <property name = "serviceInterface" value = "com.qq.db.DBUser" />
        <property name="registry" ref="registry"/>
       
    </bean>


只要客户端频繁操作或者操作一会儿就会出现这类错误。

小弟刚刚接触RMI 。不是很清清楚怎么回事。
还请大家帮我解决下。谢谢!!!

问题补充:好像就是数据库连接的问题。

数据库操作类
public class DBUserImpl extends HibernateDaoSupport implements DBUser {

我在finally中这样写的

}finally{
try {
closeConnection(conn,null,psmt);
if(super.getSession()!=null){
super.getSession().close();
}
} catch (Exception e) {
e.printStackTrace();
}

关闭了session也关闭了conn等等。

不知道是不是这个问题、

是不需要关闭conn等等吗?只关闭session???

问题补充:我贴一个完整的数据库存操作的方法吧!


类还是这样定义的:
public class DBUserImpl extends HibernateDaoSupport implements DBUser
其中的一个方法:
//用户注册
public String insertUser(User u) {
String result = "";
Connection conn = null;
PreparedStatement psmt = null;
//userid是否存在
String uid =QQID.createUserID();
User user = new User();
user.setUserid(uid);
User userid = searchUser(user);
if(userid!=null){
insertUser(u);
}
try {
String sql = "insert into user_qq (uuid,userid,username,userpass)values (SEQ_USER_QQ.NEXTVAL,?,?,?)";
conn=(Connection)super.getHibernateTemplate().getSessionFactory().openSession().connection();
psmt = conn.prepareStatement(sql);
psmt.setString(1, uid);
psmt.setString(2, u.getUsername());
QQID.getKey(KEY); //加密key
psmt.setString(3, QQID.getEncString(u.getUserpass()));
if(psmt.executeUpdate()>0)
{
log_.info("用户【"+uid+"】注册成功!");
result = uid;
}
} catch (SQLException e) {
log_.error("用户【"+uid+"】注册失败!",e);
}finally{
try {
closeConnection(conn,null,psmt);
if(super.getSession()!=null){
super.getSession().close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
return result;
}
2012年9月04日 17:32

3个答案 按时间排序 按投票排序

0 0

先关闭session.在关闭con

2012年9月04日 18:22
0 0

既然你继承了HibernateDaoSupport,你就不必自己管事务及连接释放了,交给spring来完成吧
public class DBUserImpl extends HibernateDaoSupport implements DBUser

这些代码没必要的话都可以去掉:
}finally{
try {
closeConnection(conn,null,psmt);
if(super.getSession()!=null){
super.getSession().close();
}
} catch (Exception e) {
e.printStackTrace();
}

能否贴段完成的。 怀疑你这段代码可能造成连接没有返回。

cpool.checkoutTimeout=10000
# Connection pool size
cpool.minPoolSize=5
cpool.maxPoolSize=40  ----> 这个也有可能是连接没有释放造成的。

既然你继承了HibernateDaoSupport  把Connection的管理就交给spring吧,不要自己再closeConnection(conn,null,psmt); 

2012年9月04日 18:16
0 0

哥们看这个连接
http://vipcowrie.iteye.com/blog/220683

2012年9月04日 17:44

相关推荐

    rmi 客户端 和 服务端 代码

    它通过Java的`java.rmi.*`包中的类与服务端建立连接。客户端需要知道服务端的接口(远程接口)以及接口的实现(远程对象)。客户端通过` LocateRegistry.getRegistry()` 获取服务端的注册表,并使用`Naming.lookup()...

    rmi客户端和服务端例子程序

    以上就是RMI客户端和服务端例子程序的基本工作原理。在实际开发中,我们还需要考虑异常处理、安全性、网络通信效率等因素。RMI是Java中构建分布式系统的一种强大工具,尤其适用于Java EE应用,例如EJB(Enterprise ...

    HTTP客户端,HTTP服务器,RMI客户端和服务器

    RMI客户端和服务器在分布式系统中发挥着重要作用,它们使得跨网络的对象交互成为可能。RMI客户端通过网络连接到RMI服务器,调用其注册的服务对象的方法。在实验中,你可能会学习到如何创建RMI服务接口,实现该接口的...

    rmi服务端与客户端小程序

    3. **RMI客户端** - **RemotingClient**:客户端通过` LocateRegistry.getRegistry()`获取远程注册表的引用,然后使用`Naming.lookup()`根据名称查找并获得远程对象的引用。获取到引用后,客户端可以直接调用远程...

    RMI RMI-IIOP 客户端服务器交互

    RMI-IIOP是RMI的一个扩展,它结合了RMI的功能与CORBA的IIOP(Internet Inter-ORB Protocol)协议,使得Java对象可以与CORBA系统进行交互。现在我们详细探讨这两个概念以及它们如何在客户端和服务器之间进行交互。 *...

    rmi 远程调用 实现客户端之间会话

    标题中的“rmi 远程调用 实现客户端之间会话”指的是利用RMI技术让多个客户端与同一服务端建立会话,进行交互。这通常涉及到以下几个核心概念: 1. **远程接口**:这是定义了可以远程调用的方法的接口。远程接口...

    Rmi示例 Rmi代码示例

    2. **RMI客户端**(RmiClient): - **查找远程对象**:客户端首先需要通过`java.rmi.Naming.lookup()`或`Registry.lookup()`方法从RMI注册表中获取远程对象的引用。 - **调用远程方法**:获取到远程对象的引用后...

    ThriftDemo实现客户端服务端通讯_C#_源码.zip

    在这个"ThriftDemo实现客户端服务端通讯_C#_源码.zip"压缩包中,我们很显然会找到一个使用C#实现的Thrift客户端和服务端通信的示例。 1. **Thrift IDL (接口描述语言)** Thrift IDL类似于SOAP的WSDL或Java的RMI-...

    rmi 连接多 IP 多服务端自动路由

    "rmi 连接多 IP 多服务端自动路由"这个主题涉及到如何在RMI环境中实现高可用性和容错性,当服务端在一个IP地址上不可用时,客户端能自动切换到其他IP上的服务实例。 首先,我们要理解RMI的基本工作原理。RMI系统由...

    python_rmi.rar_frequentlyu74_python_python rmi

    它可能包括了启动服务端和客户端的步骤,以及如何交互的解释。通常,readme会指导用户如何设置环境,启动服务器,然后连接并调用服务端的方法。 在Python RMI中,一些关键概念包括: - **对象序列化**:为了在不同...

    JavaRMI超棒书

    2. **银行应用程序**:Java RMI可以用来构建一个分布式银行应用程序,其中不同服务器负责处理账户、交易等业务逻辑,而客户端则可以轻松地与这些远程服务进行交互。 #### 四、Java RMI的设计与实现 1. **设计阶段*...

    java spring rmi

    2. **Spring RMI客户端的配置**: 客户端需要知道服务端的RMI服务地址,以便连接并调用远程方法: - 引入服务端的远程接口,并创建对应的代理类,通常使用Spring的`@RmiProxyFactoryBean`或`@Lookup`注解完成。 -...

    java_in_rmi.rar_Java RMI_RMI java_rmi _精通rmi

    1. RMI基础知识:解释RMI的概念,介绍其工作原理,包括客户端和服务端的角色。 2. 创建远程接口:讲解如何定义远程接口,它是远程方法调用的合同。 3. 实现远程对象:介绍如何实现远程接口,并创建远程对象实例,...

    RMI一步一步学习

    `CalculatorClient`类是RMI客户端的实现,它负责连接到服务器,获取`Calculator`接口的引用(即`CalculatorImpl_Stub`),然后调用远程方法。客户端代码通常会包含注册远程对象、查找远程对象、调用方法和处理返回...

    java-RMI技术讲解

    具体来说,RMI只能支持客户端和服务器端都是Java程序的远程调用,无法与其他非Java语言编写的应用进行通信。 #### 4. RMI的使用限制 RMI要求客户端和服务器都使用Java编写,但只要确保双方运行在兼容版本的Java...

    java文件传输RMI

    Java文件传输RMI,全称为...总之,Java文件传输RMI是一种利用Java的分布式计算能力实现的文件传输方案,适合在同一网络环境下进行高效、便捷的文件交互。通过合理的优化和错误处理,可以构建稳定可靠的文件传输系统。

    spring+rmi非本地实现

    当我们结合Spring与RMI时,可以构建分布式系统,使得服务可以在网络中的不同节点上运行并交互。 在这个“spring+rmi非本地实现”的项目中,我们有两个主要部分:客户端(client)和服务端(rmiserver)。让我们深入...

    rmi.rar_rmi

    - **运行脚本**:启动服务端和客户端的脚本,可能包括启动RMI注册表、运行服务端程序和客户端程序的命令。 理解并掌握Java RMI,开发者可以轻松构建可扩展的分布式系统,使得应用程序能够跨越网络边界,实现不同...

Global site tag (gtag.js) - Google Analytics