Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DBCP中的不可序列化异常_Java_Jsf 2_Connection Pooling_Tomcat7 - Fatal编程技术网

Java DBCP中的不可序列化异常

Java DBCP中的不可序列化异常,java,jsf-2,connection-pooling,tomcat7,Java,Jsf 2,Connection Pooling,Tomcat7,我有DAO当我使DAO可序列化时,我得到异常: Cannot serialize session attribute com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap for session C354B1B6053088CBB8E8A933E5F8EAE0 java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$

我有DAO当我使DAO可序列化时,我得到异常:

 Cannot serialize session attribute com.sun.faces.renderkit.ServerSideStateHelper.LogicalViewMap for session C354B1B6053088CBB8E8A933E5F8EAE0
    java.io.NotSerializableException: org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
我的刀:

public boolean getConnection() {
        try {
            InitialContext context = new InitialContext();
            DataSource dataSource = (DataSource) context.lookup("java:/comp/env/jdbc/Orcl");
            connection = dataSource.getConnection();
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(KPIDAO.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        } catch (NamingException ex) {
            Logger.getLogger(KPIDAO.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
    }
在控制器(@ViewScoped)中:

Context.xml

<Resource 
        name="jdbc/Orcl" 
        auth="Container"
        type="javax.sql.DataSource" 
        username="username" 
        password="password"
        driverClassName="oracle.jdbc.OracleDriver" 
        url="jdbc:oracle:thin:@192.168.1.10:1521:XE"
        maxActive="8" 
   />


什么是合适的解决方案?

您不应该在会话中存储对PoolgDataSource的引用,因为PoolgDataSource不可序列化。我建议您将其存储在其他地方,例如在应用程序上下文中。

例如

@ViewScoped
public class ViewBean implements Serializable{
  private transient KPIDAO kpiDAO = //get singleton instance from factory
  //also dont keep connection object as instance variable, fetch it from pool in methods and perform db operations.

  private void readObject(java.io.ObjectInputStream stream)
        throws java.io.IOException, ClassNotFoundException
    {
        stream.defaultReadObject();

        // assign reference manually.
        this.kpiDAO  =  //get from factory;
    }

private void writeObject(java.io.ObjectOutputStream stream)
        throws java.io.IOException
    {

        stream.defaultWriteObject();
    }
}
注意:如果将连接对象从实例变量移动到 局部方法变量,您也不需要上面的代码

更新:

从您的代码片段和异常

connection = dataSource.getConnection();
它似乎是一个实例变量

i、 e

换成

public class Dao {

 public List<Bean> getResult(){
  //local method variable
  Connection connection = //get from pool
  //perform db operation with connection object
 }
公共类Dao{
公共列表getResult(){
//局部方法变量
连接=//从池中获取
//使用连接对象执行数据库操作
}

}

那么我在会话中存储了什么PooldDatasoruce?如何?@Kitex通过连接对象,即SessionBean->KPIDAO->connection@gbagga任何有帮助的例子吗?+1@gbagga非常好。任何教程:)我真的不知道这和“将连接对象从实例变量移动到局部方法变量”的意思是什么?
public class Dao {
 private Connection connection; //instance variable
}
public class Dao {

 public List<Bean> getResult(){
  //local method variable
  Connection connection = //get from pool
  //perform db operation with connection object
 }